Answer a question

So, I'm trying to show a binary picture with only black and white using this code:

import cv2
import numpy as np

x_img = cv2.imread("lenac.tif")

x_img_g = cv2.cvtColor(x_img, cv2.COLOR_BGR2GRAY)

y = x_img_g > 128

cv2.imshow("", y*1.0)
cv2.waitKey(0)
cv2.destroyAllWindows()

But I'm getting this error:

>Traceback (most recent call last):
File "ex5.py", line 11, in <module>
cv2.imshow("", y*1.0)
cv2.error: OpenCV(4.0.0) c:\projects\opencv- 
python\opencv\modules\imgproc\src\color.hpp:261: error: (-2:Unspecified 
error) >in function '__cdecl cv::CvtHelper<struct 
cv::Set<1,-1,-1>,struct cv::Set<3,4,-1>,struct 
cv::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 6 (CV_64F).

Answers

try cv2.imshow("", y.astype('float32')) or cv2.imshow("", y.astype('uint8') * 255)

CV_64F means the numpy array dtype is float64 (64-bit floating-point).

opencv imshow only works with float32 (32-bit floating point) where the range for the pixel values is 0.0-1.0 or uint8 (unsigned 8-bit) where the range is 0-255

Since y was a bool, converting it to a number means converting True to 1

for float32, that is fine because 1 is the maximum for the imshow range

if you use uint8, that means you're trying to display pixels of value 1/255 (since the maximum imshow range for uint8 is 255) which will be barely visible, so you can multiply by 255 to bring those pixels to max and appear as bright white pixels

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐