我有一张我加载的图片:
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
不起作用。
答案 0 :(得分:13)
使用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)
答案 1 :(得分:5)
circle
只是一个包含1.0
和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)
答案 2 :(得分:1)
在这种情况下,如果您想要一个圆形图像,您必须编写一个新算法,首先您必须能够访问像素的坐标。然后,您可以简单地比较不在该圆圈范围内的像素,并将其替换为某个值(如果它与您的图像格式标准一起接受,则为NULL)。
以下是一个例子:
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
答案 3 :(得分:1)
使用NumPy assignment to an indexed array:
im[circle == 0] = [0, 0, 0]