【问题标题】:How can I apply mask to a 16bit image?如何将蒙版应用于 16 位图像?
【发布时间】:2018-07-29 09:22:30
【问题描述】:

apply mask like this to an image

如何将蒙版应用于 16 位图像?使用此代码的 8 位图像可以正常工作:

image = misc.imread('test.jpg')
gray = cv2.cvtColor(image, cv2.Color(image, cv2.COLOR_BGR2GRAY)
x = 610
y = 220
w = h = 150
mask = np.zeros(gray.shape[:2], np.uint8)
mask[y:y+h,x:x+w] = 255
res = cv2.bitwise_and(gray, gray, mask = mask)
cv2.imshow("res", res)
cv2.waitKey(0)

但是当我尝试使用 16 bit.png 图片时它不起作用。我试过这段代码:

mask = np.zeros(gray.shape[:2], np.uint16)
mask[y:y+h, x:x+w] = 6535
res = cv2.bitwise_and(gray, gray, mask = mask)

我得到错误:

res = cv2.bitwise_and(gray, gray, mask = mask) cv2.error: /home/... : error: (-215) (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize (*psrc1) 在函数 binary_op 中

有人知道我如何在我的 16 位图像上应用蒙版吗?

【问题讨论】:

  • 正确格式化您的问题,我希望缺少的= 也只是一个草率
  • 另外,你为什么使用 bitwise_and 来应用掩码?
  • 我使用 bitwise_and 来应用蒙版,因为我不知道该怎么做。有没有办法屏蔽 16 位图像?
  • 如my answer 中所述,mask 需要为 8 位。为什么你希望它是 16 位的?它本质上只是一个布尔数组,由于 C 没有布尔类型,它是一个“无符号整数 8”类型uint8_t。
  • 您的掩码是0s 和255s 的数组。只有一点点信息。您似乎误解了 bitwise_and 函数的作用。掩码只是图像上的布尔过滤器,它不会降低gray 数组的保真度。

标签: python opencv


【解决方案1】:

根据OpenCV documentation,mask需要8位:

mask – 可选操作掩码,8 位单通道数组,指定要更改的输出数组的元素。

错误消息似乎反映了这一点,

res = cv2.bitwise_and(gray, gray, mask = mask) cv2.error: /home/... : error: (-215) (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize (*psrc1) 在函数 binary_op 中

因为它告诉您掩码的日期类型需要是 8 位无符号或 8 位有符号(整数)。

所以你的面具的定义需要是

mask = np.zeros(gray.shape[:2], np.uint8)
mask[y:y+h,x:x+w] = 255

像以前一样。

【讨论】:

    【解决方案2】:

    试试

    mask = np.zeros(gray.shape[:2], np.uint16)
    mask[y:y+h, x:x+w] = 1
    res = gray * mask
    

    【讨论】:

    • 我试过了。你的意思是 'mask = np.zeros(gray.shape[:2], np.uint16)?' 但我得到一张黑色的图片..
    • 之所以为黑色,是因为它不是作为 16 位数组读取的。我使用 'gray = misc.imread('test.png')' 但我的图像是 8 位图像。所以也许这就是你的例子不起作用的问题。那么如何读取 16 位 .png 图像呢?
    • @Anja 我修正了错字。您提供的错误意味着您的灰度图像不是灰色的,它是 3 通道的。每个元素的乘法运算符需要操作数的形状相同。所以,更一般的答案是 - 使蒙版和图像的形状相等并使用 * orerator。
    • @Anja OpenCV 有 cv2.IMREAD_ANYDEPTH 标志来加载任意深度的图像。
    • 使用res = gray * mask[..., np.newaxis] 将掩码扩展到所有三个通道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2012-12-09
    相关资源
    最近更新 更多