<p>这可能是因为您的数据类型。<code>imwrite</code>和<code>imshow</code>根据数据类型自动决定如何处理数据。如<a href="http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=imwrite#imwrite" rel="nofollow noreferrer">imwrite</a>和<a href="http://docs.opencv.org/2.4/modules/highgui/doc/user_interface.html?highlight=imshow#cv2.imshow" rel="nofollow noreferrer">imshow</a>的文档所述:</p>
<p><code>imwrite</code>:</p>
<blockquote>
<p>The function imwrite saves the image to the specified file. The image format is chosen based on the filename extension (see imread() for the list of extensions). Only 8-bit (or 16-bit unsigned (CV_16U) in case of PNG, JPEG 2000, and TIFF) single-channel or 3-channel (with ‘BGR’ channel order) images can be saved using this function.</p>
</blockquote>
<p><code>imshow</code>:</p>
<blockquote>
<p>The function may scale the image, depending on its depth:</p>
<ul>
<li>If the image is 8-bit unsigned, it is displayed as is. </li>
<li>If the image is 16-bit unsigned or 32-bit integer, the pixels are divided by 256.
That is, the value range [0,255*256] is mapped to [0,255]. </li>
<li>If the
image is 32-bit floating-point, the pixel values are multiplied by
<ol start="255">
<li>That is, the value range [0,1] is mapped to [0,255].</li>
</ol></li>
</ul>
</blockquote>
<p>因此,您的底层数据类型似乎不是无符号字符,而是float或32位整数。在</p>
<p>此外,由于操作优先级,您可能会遇到以下问题:</p>
<p><code>(255)*(nir_img-red_img)/(nir_img+red_img)</code></p>
<p>你可能会溢出。最好将值设置在[0;1]的范围内,而不是将其相乘:</p>
<p><code>(255) * ( (nir_img-red_img)/(nir_img+red_img) )</code></p>