为什么 cv2.COLOR_RGB2GRAY 因输入图像深度不受支持而失败?
Why is cv2.COLOR_RGB2GRAY failing with Unsupported depth of input image?
我有一个从 ML 程序生成的掩码,它是 (544,544,1)。 RGB 图像是 (544,544,3)。我需要在蒙版中找到轮廓并将它们绘制在 RGB 图像上。我试图将蒙版转换为灰度,但所有尝试都可能因格式问题而失败。
resized_image - Incomming RGB image
mask - Mask generated from ML script
print(f"Resized rgb image shape : {resized_image.shape}, Mask image shape {mask.shape}")
tmp_mask = np.zeros(resized_image.shape, dtype=np.uint8)+255
bump = tmp_mask * mask
print(bump.shape)
gray = cv2.cvtColor(bump, cv2.COLOR_RGB2GRAY)
输出结果如下:
Resized rgb image shape : (544, 544, 3), Mask image shape (544, 544, 1)
(544, 544, 3)
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-33-07ef46f74c90> in <module>
12 bump = tmp_mask * mask
13 print(bump.shape)
---> 14 gray = cv2.cvtColor(bump, cv2.COLOR_RGB2GRAY)
15
16 #gray_image = cv2.cvtColor(bump, cv2.COLOR_BGR2GRAY)
error: OpenCV(4.5.5) d:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\color.simd_helpers.hpp:94: error: (-2:Unspecified error) in function '__cdecl cv::impl::`anonymous-namespace'::CvtHelper<struct cv::impl::`anonymous namespace'::Set<3,4,-1>,struct cv::impl::A0x7123906f::Set<1,-1,-1>,struct cv::impl::A0x7123906f::Set<0,2,5>,2>::CvtHelper(const class cv::_InputArray &,const class cv::_OutputArray &,int)'
> Unsupported depth of input image:
> 'VDepth::contains(depth)'
> where
> 'depth' is 4 (CV_32S)
如何解决这里的格式问题(不支持的输入图像深度)?有没有其他更简单的方法来找到蒙版图像中的轮廓?
重现
cv2.cvtColor(np.ones((30,30,3), dtype=np.int32), cv2.COLOR_RGB2GRAY)
解释
depth
不是通道(数组形状的一部分),它是每个数字的字节数。 int32 将使用 4*8 位来表示一个整数,而 uint8 只使用 1*8 位。
cvtColor
需要 np.float32
,或 np.uint8
作为数据类型。
我们可以猜测tmp_mask.dtype
== np.uint8
所以,请通过print(mask.dtype)
检查mask
变量的dtype
我有一个从 ML 程序生成的掩码,它是 (544,544,1)。 RGB 图像是 (544,544,3)。我需要在蒙版中找到轮廓并将它们绘制在 RGB 图像上。我试图将蒙版转换为灰度,但所有尝试都可能因格式问题而失败。
resized_image - Incomming RGB image
mask - Mask generated from ML script
print(f"Resized rgb image shape : {resized_image.shape}, Mask image shape {mask.shape}")
tmp_mask = np.zeros(resized_image.shape, dtype=np.uint8)+255
bump = tmp_mask * mask
print(bump.shape)
gray = cv2.cvtColor(bump, cv2.COLOR_RGB2GRAY)
输出结果如下:
Resized rgb image shape : (544, 544, 3), Mask image shape (544, 544, 1)
(544, 544, 3)
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-33-07ef46f74c90> in <module>
12 bump = tmp_mask * mask
13 print(bump.shape)
---> 14 gray = cv2.cvtColor(bump, cv2.COLOR_RGB2GRAY)
15
16 #gray_image = cv2.cvtColor(bump, cv2.COLOR_BGR2GRAY)
error: OpenCV(4.5.5) d:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\color.simd_helpers.hpp:94: error: (-2:Unspecified error) in function '__cdecl cv::impl::`anonymous-namespace'::CvtHelper<struct cv::impl::`anonymous namespace'::Set<3,4,-1>,struct cv::impl::A0x7123906f::Set<1,-1,-1>,struct cv::impl::A0x7123906f::Set<0,2,5>,2>::CvtHelper(const class cv::_InputArray &,const class cv::_OutputArray &,int)'
> Unsupported depth of input image:
> 'VDepth::contains(depth)'
> where
> 'depth' is 4 (CV_32S)
如何解决这里的格式问题(不支持的输入图像深度)?有没有其他更简单的方法来找到蒙版图像中的轮廓?
重现
cv2.cvtColor(np.ones((30,30,3), dtype=np.int32), cv2.COLOR_RGB2GRAY)
解释
depth
不是通道(数组形状的一部分),它是每个数字的字节数。 int32 将使用 4*8 位来表示一个整数,而 uint8 只使用 1*8 位。
cvtColor
需要 np.float32
,或 np.uint8
作为数据类型。
我们可以猜测tmp_mask.dtype
== np.uint8
所以,请通过print(mask.dtype)
mask
变量的dtype