如何使用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中。
:)
一只甜甜圈
TA贡献1836条经验 获得超5个赞
需要注意的是,图像切片也没有创造的一个副本cropped image
,但创建pointer
的roi
。如果要加载这么多图像,使用切片裁剪图像的相关部分,然后附加到列表中,这可能会造成巨大的内存浪费。
假设您每个都加载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提到,但我花了相当长的一段时间去找出(即,调试等)。所以,我认为值得一提。
添加回答
举报
0/150
提交
取消