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

Python 如何使用Numpy/OpenCV屏蔽图像?,python,opencv,numpy,Python,Opencv,Numpy,我加载了一个图像: im = cv2.imread(filename) 我想保留图像中心的数据。我创建了一个圆作为我想要保留的区域的遮罩 我用以下方法创建了圆: height,width,depth = im.shape circle = np.zeros((height,width)) cv2.circle(circle,(width/2,height/2),280,1,thickness=-1) 如何从原始图像中屏蔽圆外的数据 masked_data = im * circle 不起作

我加载了一个图像:

im = cv2.imread(filename)
我想保留图像中心的数据。我创建了一个圆作为我想要保留的区域的遮罩

我用以下方法创建了圆:

height,width,depth = im.shape
circle = np.zeros((height,width))
cv2.circle(circle,(width/2,height/2),280,1,thickness=-1)
如何从原始图像中屏蔽圆外的数据

masked_data = im * circle

不起作用。

circle
只是一个2D数组,具有
1.0
s和
0.0
s。Numpy需要帮助来理解你想对你的
im
的第三维空间做什么,所以你必须给它一个额外的轴,然后你的线条才能工作

masked_data = im * circle[..., np.newaxis]
但请注意,如果图像缺少alpha通道,则遮罩只是根据您的代码将圆圈外的事物的颜色设置为
(0,0,0)

但是,您还有另一个潜在问题:
circle
将是默认数据类型(可能是
float64
float32
。这对您的图像不好,因此您应该将创建
circle
的行更改为

circle = np.zeros((height, width), dtype=im.dtype)

在这种情况下,如果你想有一个圆形图像,你必须编写一个新的算法,首先你必须能够访问像素的坐标。然后你可以简单地比较不在该圆形范围内的像素,并用一些值替换它们(如果你的图像格式标准接受,则为空)

以下是一个例子:

import cv2
import numpy as np
im = cv2.imread('sss.png')


def facechop(im):

 height,width,depth = im.shape
 #circle = np.zeros((height,width))
 #print circle
 x=width/2
 y=height/2
 circle=cv2.circle(im,(width/2,height/2),180,1,thickness=1)
 #newcameramtx, roi=cv2.getOptimalNewCameraMatrix(im,10,(w,h),1,(w,h))
 cv2.rectangle(im,(x-180,y-180),(x+180,y+180),(0,0,255),2)
 crop_img = im[y-180:y+180,x-180:x+180]
 lastim=np.equal(crop_img,circle)
 #dd=np.logical_and(crop_img,circle)

 for i in range(len(last_im)) :
     if last_im[i].all()==False:
         crop_img[i]=[0,0,0]


 cv2.imshow('im',crop_img)
if __name__ == '__main__':
    facechop(im)
    while(True):
        key = cv2.waitKey(20)
        if key in [27, ord('Q'), ord('q')]:
            break

使用
cv2.按位_和
并将圆作为掩码传递

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)
使用:


你想做麦田怪圈吗?是的。我想把一切都放在怪圈内。这只是一个numpy广播的问题吗?这是一个社区维基,由@unutbu回答。非常感谢你的回答@Froyo。颜色参数必须是255,我才能工作。所以代码应该是
cv2.circle(circle\u img,(width/2,height/2),280255,厚度=-1)
(宽度/2,高度/2)
给出圆在图像上的位置(希望是中心),而
280
是大小(希望是半径)圆的。此定位是否直接转换为坐标定位?宽度和高度以np.0向后,圆填充颜色应为255
im[circle == 0] = [0, 0, 0]