Python 如何将遮罩应用于16位图像?

Python 如何将遮罩应用于16位图像?,python,opencv,Python,Opencv,如何将遮罩应用于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, gra

如何将遮罩应用于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)
mask = np.zeros(gray.shape[:2], np.uint16)
mask[y:y+h, x:x+w] = 6535
res = cv2.bitwise_and(gray, gray, mask = mask)
但是当我尝试使用16位.png图片时,它不起作用。我尝试了以下代码:

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)
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。按位_和(灰色,灰色,掩码=掩码)cv2。错误:/home/…:错误:(-215)(mtype==CV|8U | | mtype==CV|8S)&&&U mask.sameSize(*psrc1)在函数binary|op中

有人知道如何将掩码应用于16位图像吗?

根据要求,
掩码需要为8位:

掩码–可选操作掩码,8位单通道阵列,指定要更改的输出阵列元素

错误消息似乎反映了

res=cv2。按位_和(灰色,灰色,掩码=掩码)cv2。错误:/home/…:错误:(-215)(mtype==CV|8U | | mtype==CV|8S)&&&U mask.sameSize(*psrc1)在函数binary|op中

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

所以你的面具的定义需要

mask = np.zeros(gray.shape[:2], np.uint8)
mask[y:y+h,x:x+w] = 255
与前面一样。

根据
掩码需要为8位:

掩码–可选操作掩码,8位单通道阵列,指定要更改的输出阵列元素

错误消息似乎反映了

res=cv2。按位_和(灰色,灰色,掩码=掩码)cv2。错误:/home/…:错误:(-215)(mtype==CV|8U | | mtype==CV|8S)&&&U mask.sameSize(*psrc1)在函数binary|op中

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

所以你的面具的定义需要

mask = np.zeros(gray.shape[:2], np.uint8)
mask[y:y+h,x:x+w] = 255
像以前一样。

试试看

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



正确设置问题的格式,我希望缺少的
=
只是一个草率的问题。另外,为什么要使用按位\u并应用掩码?我使用按位\u并应用掩码,因为我不知道如何做。。有没有办法屏蔽16位图像?如中所述,
mask
需要8位。为什么您希望它是16位的?它本质上只是一个布尔数组,由于C没有布尔类型,它是一个“unsigned int 8”类型
uint8\u t
。掩码是一个
0
s和
255
s的数组。只有一点信息。您似乎误解了
按位\u和
函数的作用。遮罩只是图像上的一个布尔过滤器,它不会降低
灰色数组的保真度。正确设置问题的格式,我希望缺少的
=
只是一个草率的问题。另外,为什么要使用按位_并应用遮罩?我使用按位_并应用遮罩,因为我不知道如何做。。有没有办法屏蔽16位图像?如中所述,
mask
需要8位。为什么您希望它是16位的?它本质上只是一个布尔数组,由于C没有布尔类型,它是一个“unsigned int 8”类型
uint8\u t
。掩码是一个
0
s和
255
s的数组。只有一点信息。您似乎误解了
按位\u和
函数的作用。遮罩只是图像上的一个布尔过滤器,它不会降低
灰色
数组的保真度。我试过了。你的意思是‘mask=np.zero(gray.shape[:2],np.uint16)’但我得到了一张黑色的图片。它是黑色的原因是因为它不是作为16位数组读取的。我使用'gray=misc.imread('test.png')',但我的图像是8位图像。也许这就是你的例子不起作用的原因。那么我怎样才能读入16位的png图像呢?@Anja我修正了输入错误。您提供的错误意味着您的灰色图像不是灰色的,它是3通道的。每个元素的乘法运算符需要操作数具有相同的形状。因此,更一般的答案是-使遮罩和图像的形状相等,并使用*orerator.@Anja OpenCV具有cv2.IMREAD\u ANYDEPTH标志以加载具有任意深度的图像。使用
res=gray*mask[…,np.newaxis]
将遮罩扩展到所有三个通道。我尝试过。你的意思是‘mask=np.zero(gray.shape[:2],np.uint16)’但我得到了一张黑色的图片。它是黑色的原因是因为它不是作为16位数组读取的。我使用'gray=misc.imread('test.png')',但我的图像是8位图像。也许这就是你的例子不起作用的原因。那么我怎样才能读入16位的png图像呢?@Anja我修正了输入错误。您提供的错误意味着您的灰色图像不是灰色的,它是3通道的。每个元素的乘法运算符需要操作数具有相同的形状。因此,更一般的答案是-使遮罩和图像的形状相等,并使用*orerator.@Anja OpenCV具有cv2.IMREAD\u ANYDEPTH标志以加载具有任意深度的图像。使用
res=gray*mask[…,np.newaxis]
将遮罩扩展到所有三个通道。