有人可以解释为什么OpenCV imshow
和imwrite
函数似乎会产生完全不同的图像吗?
第一张图片对应imshow
,第二张图片对应imwrite
。
Result
是一个介于0和255之间的浮点值数组。
**result = result.astype(np.uint8)**
cv2.imshow('img', result)
cv2.imwrite('img.png', result)
答案 0 :(得分:8)
我在OpenCV 2.4.8中使用了以下(c ++)代码:
cv::Mat_<float> img(300,300);
cv::theRNG().fill(img,cv::RNG::UNIFORM,0,255);
cv::imshow("Img",img);
cv::waitKey();
cv::imwrite("test.png",img);
它会产生以下图像:
imshow
。
imwrite
。
这是由于两个函数的范围期望不同,imwrite
总是期望[0,255],而imshow
期望[0,1]表示浮点和[0,255]对于未签名的字符。
为了使用imshow
显示正确的输出,您需要将浮点图像的范围从[0,255]缩小到[0,1]。您可以使用convertTo
和适当的缩放系数执行此操作,或者只需将图像除以255即可。
答案 1 :(得分:1)
因为你使用的是python,这可能会有所帮助:
def showimg(img):
cv2.namedWindow("test", cv2.WINDOW_NORMAL)
img = np.array(img,dtype=float)/float(255)
cv2.imshow('test',img)
cv2.resizeWindow('test',600,600)
cv2.waitKey(0)