Opencv + Python cv2.imwrite()和cv.imshow两个图像呈现不同的输出

时间:2017-08-18 07:03:16

标签: python opencv image-processing

我使用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_imshow_op

第二张图片是cv2.imwrite()

的输出

Cv2_imwrite_op

2 个答案:

答案 0 :(得分:1)

由于您的数据类型,可能会发生这种情况。 imwriteimshow确定如何自动处理数据,转发数据类型。正如imwriteimshow的文档中所述:

imwrite

  

imwrite函数将图像保存到指定的文件中。基于文件扩展名选择图像格式(请参阅imread()以获取扩展名列表)。对于PNG,JPEG 2000和TIFF,只有8位(或16位无符号(CV_16U))单通道或3通道(带'BGR'通道顺序)图像可以使用此功能保存。

imshow

  

该功能可能会缩放图像,具体取决于其深度:

     
      
  • 如果图像是8位无符号,则按原样显示。
  •   
  • 如果图像是16位无符号或32位整数,则像素除以256。   也就是说,值范围[0,255 * 256]被映射到[0,255]。
  •   
  • 如果   图像是32位浮点,像素值乘以      
        
    1. 即,值范围[0,1]映射到[0,255]。
    2.   
  •   

因此,您的基础数据类型似乎不是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)