OpenCV Python中的兴趣区域

22 投票
3 回答
119734 浏览
提问于 2025-04-17 19:10

我正在尝试使用opencv的python库获取图像的一部分(也就是感兴趣区域,简称ROI)。我使用的opencv版本是2.4.3。不过,当我尝试调用这个接口时

cv2.SetImageROI

却出现了这个错误

AttributeError: 'module' object has no attribute 'SetImageROI'

而且查看文档后发现,这个接口似乎是一个旧版的python函数。

http://docs.opencv.org/2.4.3/search.html?q=setimageroi

我不太确定在这个版本的opencv中该如何获取ROI。有没有人能建议我该怎么做呢?

谢谢

3 个回答

6

正如在文档中提到的,关于你收到的错误信息,你需要先导入合适的模块,然后再调用SetImageROI()方法:

import cv
cv.SetImageROI(imag, rect)
23

这里有一个关于如何从图片中选择感兴趣区域(ROI)的可视化示例。

-------------------------------------------
|                                         | 
|    (x1, y1)      w                      |
|      ------------------------           |
|      |                      |           |
|      |                      |           | 
|      |         ROI          | h         |  
|      |                      |           |   
|      |                      |           |   
|      |                      |           |       
|      ------------------------           |   
|                           (x2, y2)      |    
|                                         |             
|                                         |             
|                                         |             
-------------------------------------------

我们把(0,0)看作是图片的左上角,x轴是从左到右,y轴是从上到下。如果我们有(x1,y1)作为ROI的左上角,(x2,y2)作为右下角,我们可以用Numpy的切片功能来裁剪图片,方法是:

ROI = image[y1:y2, x1:x2]

不过通常我们不会直接有右下角的坐标。在大多数情况下,我们更可能会得到ROI的边界框(x,y,w,h)的坐标,这些坐标是通过cv2.boundingRect()在遍历轮廓时获得的。

cnts = cv2.findContours(grayscale_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    ROI = image[y:y+h, x:x+w]

自从OpenCV 2.2版本以来,Numpy数组被简单地用来显示图片。这种用Numpy切片提取ROI的方法在旧版本中可能无法使用。

41

好的,经过进一步分析,我意识到cv2已经支持numpy数组结构,所以不再需要单独的API了,整个图像可以直接在数组里进行操作。

比如:

img = cv2.imread('image.png')
img = img[c1:c1+25,r1:r1+25]

这里c1是左侧列的像素位置,r1是对应的行位置。而img现在包含了在这些像素范围内指定的图像,称为感兴趣区域(ROI)。

编辑:这里解释得很好,如何在Python中使用opencv复制图像区域?

撰写回答