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

如何使用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。如果是这种情况,请解释我如何正确使用此功能。


肥皂起泡泡
浏览 2477回答 3
3回答

繁星淼淼

我有这个问题,在这里找到另一个答案:复制感兴趣的区域如果我们将(0,0)视为图像的左上角,im从左到右称为x方向,从上到下称为y方向。我们将(x1,y1)作为左上顶点,将(x2,y2)作为该图像中矩形区域的右下顶点,然后:roi = im[y1:y2, x1:x2]这里有一个关于numpy数组索引和切片的综合资源,它可以告诉你更多关于裁剪图像的一部分的事情。图像将作为numpy数组存储在opencv2中。:)

一只甜甜圈

需要注意的是,图像切片也没有创造的一个副本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提到,但我花了相当长的一段时间去找出(即,调试等)。所以,我认为值得一提。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python