为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用Python在OpenCV中裁剪图像

如何使用Python在OpenCV中裁剪图像

肥皂起泡泡 2019-07-23 19:31:10
如何使用Python在OpenCV中裁剪图像我如何使用OpenCV裁剪图像,就像我之前在PIL中所做的那样。关于PIL的工作示例im = Image.open('0.png').convert('L')im = im.crop((1, 1, 98, 33))im.save('_0.png')但是我怎么能在OpenCV上做到这一点?这是我试过的:im = cv.imread('0.png', cv.CV_LOAD_IMAGE_GRAYSCALE)(thresh, im_bw) = cv.threshold(im, 128, 255, cv.THRESH_OTSU)im = cv.getRectSubPix(im_bw, (98, 33), (1, 1))cv.imshow('Img', im)cv.waitKey(0)但它不起作用。我想我错误地使用了getRectSubPix。如果是这种情况,请解释我如何正确使用此功能。
查看完整描述

3 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

我有这个问题,在这里找到另一个答案:复制感兴趣的区域

如果我们将(0,0)视为图像的左上角,im从左到右称为x方向,从上到下称为y方向。我们将(x1,y1)作为左上顶点,将(x2,y2)作为该图像中矩形区域的右下顶点,然后:

roi = im[y1:y2, x1:x2]

这里有一个关于numpy数组索引和切片的综合资源,它可以告诉你更多关于裁剪图像的一部分的事情。图像将作为numpy数组存储在opencv2中。

:)


查看完整回答
反对 回复 2019-07-23
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

需要注意的是,图像切片也没有创造的一个副本cropped image,但创建pointerroi。如果要加载这么多图像,使用切片裁剪图像的相关部分,然后附加到列表中,这可能会造成巨大的内存浪费。

假设您每个都加载N个图像,>1MP并且您只需要100x100左上角的区域。

Slicing

X = []for i in range(N):
    im = imread('image_i')
    X.append(im[0:100,0:100]) # This will keep all N images in the memory. 
                              # Because they are still used.

或者,您可以复制相关部分.copy(),因此垃圾收集器将删除im

X = []for i in range(N):
    im = imread('image_i')
    X.append(im[0:100,0:100].copy()) # This will keep all only the crops in the memory. 
                                     # im's will be deleted by gc.

找出在此之后,我意识到一个评论user1270710提到,但我花了相当长的一段时间去找出(即,调试等)。所以,我认为值得一提。


查看完整回答
反对 回复 2019-07-23
  • 3 回答
  • 0 关注
  • 2476 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信