【问题标题】:How to Mask an image using Numpy/OpenCV?如何使用 Numpy/OpenCV 屏蔽图像?
【发布时间】:2014-09-24 07:38:17
【问题描述】:

我有一张要加载的图片:

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

不工作。

【问题讨论】:

  • 你要麦田圈吗?
  • 是的。我想把所有东西都放在圈子里。
  • 那么这只是numpy广播的问题吗?

标签: python opencv numpy


【解决方案1】:

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

【讨论】:

  • 非常感谢@Froyo 的回答。颜色参数必须是 255 才能工作。所以代码应该是cv2.circle(circle_img,(width/2,height/2),280,255,thickness=-1)
  • (width/2,height/2) 给出了圆在图像上的位置(希望是中心),而280 是圆的大小(希望是半径)。这个定位是否直接转化为x,y坐标定位?
  • 宽高在np.zeros中倒数,圆的填充颜色应该是255
【解决方案2】:

circle 只是一个包含1.0s 和0.0s 的二维数组。 Numpy 需要帮助来了解您想对 im 的第三维做什么,因此您必须给它一个额外的轴,然后您的线才能工作。

masked_data = im * circle[..., np.newaxis]

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

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

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

【讨论】:

    【解决方案3】:

    使用NumPy assignment to an indexed array

    im[circle == 0] = [0, 0, 0]
    

    【讨论】:

    【解决方案4】:

    在这种情况下,如果您想要一个圆形图像,您必须编写一个新算法,并且首先您必须能够访问像素的坐标。然后,您可以简单地比较不在该圆圈范围内的像素,并将它们替换为某个值(如果您的图像格式标准接受,则为 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      相关资源
      最近更新 更多