Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python cv2.imshow和cv2.imwrite_Python_Opencv - Fatal编程技术网

Python cv2.imshow和cv2.imwrite

Python cv2.imshow和cv2.imwrite,python,opencv,Python,Opencv,有人能解释一下为什么OpenCVimshow和imwrite函数会产生完全不同的图像吗 第一张图片对应于imshow,第二张图片对应于imwrite。 Result是一个介于0和255之间的浮点值数组 **result = result.astype(np.uint8)** cv2.imshow('img', result) cv2.imwrite('img.png', result) 我在OpenCV 2.4.8中使用了以下(c++)代码: cv::Mat_<float> im

有人能解释一下为什么OpenCV
imshow
imwrite
函数会产生完全不同的图像吗

第一张图片对应于
imshow
,第二张图片对应于
imwrite
Result
是一个介于0和255之间的浮点值数组

**result = result.astype(np.uint8)**
cv2.imshow('img', result)
cv2.imwrite('img.png', result)
我在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);
cv::Mat_uimg(300300);
cv::theRNG().fill(img,cv::RNG::UNIFORM,0255);
cv::imshow(“Img”,Img);
cv::waitKey();
cv::imwrite(“test.png”,img);
它会产生以下图像:

使用
imshow

使用
imwrite

这是由于两个函数的范围期望不同,
imwrite
始终期望[0255],而
imshow
期望[0,1]用于浮点,而[0255]用于无符号字符


为了使用
imshow
显示正确的输出,需要将浮点图像的范围从[0255]减小到[0,1]。您可以使用
convertTo
和适当的比例因子,或者只需将图像除以255即可完成此操作。

由于您使用的是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)

我拿了第一张图片并试了试,我得到了这两张的第一张图片(但我在这里使用的是opencv3.0)我使用的是Python版本3.3你使用的是哪个opencv版本?它是使用opencv的png库还是您系统中的其他东西?try:cv2.getBuildInformation()imwrite根本不处理浮点图像。
result.astype(np.uint8)
不更改结果对象。您需要将该操作的返回值分配给某个对象。但是,如果result=result.astype(np.uint8),两个图像现在看起来都是相同的,其值介于[0255]之间,这对于其他一些项目也是如此。哦,所以(稀疏)第一个图像实际上是对浮点图像中任何大于1到1的内容进行饱和的结果?@berak yes第一个图像是饱和的。@Matthias如果在不修改值的情况下将浮点图像转换为无符号字符,则有一个具有[0255]值的无符号字符图像,因此两个函数具有相同的行为。如果不转换类型,则有一个值为[0255]的浮点图像,因此这两个函数具有不同的行为。@Matthia是的,稠密图像是正确的。而
uint8
是8位上的无符号整数,它是
无符号字符。标准
无符号int
通常为32位;)