如何使用Numpy/OpenCV屏蔽图像?

Hid*_*ame 9 python opencv numpy

我有一个加载的图像:

im = cv2.imread(filename)
Run Code Online (Sandbox Code Playgroud)

我想保留位于图像中心的数据.我创建了一个圆圈作为我想要保留的区域的面具.

我创建了圆圈:

height,width,depth = im.shape
circle = np.zeros((height,width))
cv2.circle(circle,(width/2,height/2),280,1,thickness=-1)
Run Code Online (Sandbox Code Playgroud)

如何从原始图像中屏蔽圆圈外的数据?

masked_data = im * circle
Run Code Online (Sandbox Code Playgroud)

不起作用.

Fro*_*oyo 14

使用cv2.bitwise_and并将圆圈作为蒙版传递.

im = cv2.imread(filename)
height,width,depth = im.shape
circle_img = np.zeros((height,width), np.uint8)
cv2.circle(circle_img,(width/2,height/2),280,1,thickness=-1)

masked_data = cv2.bitwise_and(im, im, mask=circle_img)

cv2.imshow("masked", masked_data)
cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)


dei*_*aur 5

circle只是一个带有1.0s和0.0s 的2D数组.Numpy需要帮助来了解你想要用你的第三个维度做什么,im所以你必须给它一个额外的轴,然后你的线就行了.

masked_data = im * circle[..., np.newaxis]
Run Code Online (Sandbox Code Playgroud)

但请注意,(0, 0, 0)如果图像缺少alpha通道,则屏蔽只是根据您的代码将颜色设置为圆外的事物.

但是你有另一个潜在的问题:circle将默认的数据类型的(这可能会float64float32这不利于你的形象,所以你应该改变在其中创建行了.circle

circle = np.zeros((height, width), dtype=im.dtype)
Run Code Online (Sandbox Code Playgroud)