我使用Opencv(3.0)和Python 2.7进行图像处理,但我遇到cv2.imwrite()
和cv2.imshow()
的问题。它们产生不同的输出,我的代码如下:
tfinal = (255)*(nir_img-red_img)/(nir_img+red_img)
cv2.imwrite(_db_img1+'_NDVI'+_ext_img,tfinal)
cv2.imshow('NDVI',tfinal)
第一张图片是cv2.imshow()
第二张图片是cv2.imwrite()
答案 0 :(得分:1)
由于您的数据类型,可能会发生这种情况。 imwrite
和imshow
确定如何自动处理数据,转发数据类型。正如imwrite和imshow的文档中所述:
imwrite
:
imwrite函数将图像保存到指定的文件中。基于文件扩展名选择图像格式(请参阅imread()以获取扩展名列表)。对于PNG,JPEG 2000和TIFF,只有8位(或16位无符号(CV_16U))单通道或3通道(带'BGR'通道顺序)图像可以使用此功能保存。
imshow
:
该功能可能会缩放图像,具体取决于其深度:
- 如果图像是8位无符号,则按原样显示。
- 如果图像是16位无符号或32位整数,则像素除以256。 也就是说,值范围[0,255 * 256]被映射到[0,255]。
- 如果 图像是32位浮点,像素值乘以
- 即,值范围[0,1]映射到[0,255]。
因此,您的基础数据类型似乎不是unsigned char,而是float或32位整数。
同样由于操作优先级,您可能会遇到以下问题:
(255)*(nir_img-red_img)/(nir_img+red_img)
你可能遇到溢出。最好设置[0;范围内的值。 1]而不是乘以它们:
(255) * ( (nir_img-red_img)/(nir_img+red_img) )
答案 1 :(得分:0)
感谢Melnikov Sergei对矿山解决方案的简要介绍。 我已经使用我的程序中修改的以下语法解决了这个问题 当我写我的图像乘以255并且我得到相同的结果。
tfinal = (255)*(nir_img-red_img)/(nir_img+red_img)
cv2.imwrite(_db_img1+'_NDVI'+_ext_img,tfinal*255)
cv2.imshow('NDVI',tfinal)