Python opencv过滤所有感兴趣区域之外的所有内容

时间:2015-05-27 06:30:38

标签: python opencv image-processing

给定一个图像和一组点(点数> = 3),这组点将形成一个多边形,这是我感兴趣的区域,我的目的是过滤此图像之外的所有内容感兴趣的区域,而它内部的区域没有受到影响。

例如,给定大小为712 x 480 px的图像和点

[[120,160] [100,130] [120,100] [140,130]]

我所做的是

#Create an array of object rect which represents the region of interest
rect = [[120,160], [100,130], [120,100],[140,130]]
mask = np.array([rect], dtype=np.int32)

#Create a new array filled with zeros, size equal to size of the image to be filtered
image2 = np.zeros((480, 712), np.int8)

cv2.fillPoly(image2, [mask],255)

在此步骤之后,image2将是一个到处为0的数组,除了位置与我感兴趣的区域完全相同的区域。在这一步之后我做的是:

output = cv2.bitwise_and(image, image2)

image这是我的输入图片。我收到这个错误:

cv2.error: ..\..\..\..\opencv\modules\core\src\arithm.cpp:1021: error: (-209) The operation is neither 'array op array' (where arrays have the same size and type), nor 'array op scalar', nor 'scalar op array' in function cv::binary_op

我真的不明白我在这里做错了什么。另外,我的问题还有其他解决办法吗?我仍然是opencv的新手,并且在我去的时候仍然在学习一切。如果有更好的方法/库使用请建议。谢谢!

1 个答案:

答案 0 :(得分:3)

我刚刚找到了解决问题的方法。所以不要写这个

output = cv2.bitwise_and(image, image2)

我首先将image2转换为二进制掩码,然后使用原始图像bitwise_and。所以代码应该是这样的

maskimage2 = cv2.inRange(image2, 1, 255)
out = cv2.bitwise_and(image, image, mask=maskimage2)

这样做会使感兴趣区域之外的所有内容都具有二进制值0.如果您发现任何缺陷,请发表评论。