Python matplolib ListedColormap 将所有图像绘制为黄色但几乎完全相同的图像绘制正确

Python matplolib ListedColormap paints all image yellow but identical almost image paints correctly

偶然发现一个非常奇怪的问题 problem.I 从 agro 创建一个 tgi 图像 images.Althought 我有两个非常类似的 agro 图像,颜色几乎相同,其中一个 tif 文件生成了一个很好的 tgi 图像但是另一个生成完整的 tgi 图像 yellow.I 应用 matplolib.ListedColormap 我认为我的代码错误:

import cv2
import numpy as np
from PIL import Image
from matplotlib import colors




HD_rgb_tgi =  cv2.imread('good_tif.tif',cv2.IMREAD_UNCHANGED)
red = HD_rgb_tgi[:,:,0].astype('float64')
green = HD_rgb_tgi[:,:,1].astype('float64')
blue = HD_rgb_tgi[:,:,2].astype('float64')
tgi=(-1) * 0.5 * ((200*(red-green))-(100 * (red-blue)))
tgi_normalized = ((tgi - np.amin(tgi)) / (np.amax(tgi) - np.amin(tgi)))
tgi_f = Image.fromarray(np.uint8(colors.ListedColormap([ '#C90000', '#CF630A'  , '#EBE42D', '#27FF0F', '#0C750C'])(tgi_normalized) * 255))
tgi_f = tgi_f.convert('RGBA')
tgi_f=cv2.cvtColor(np.float32(tgi_f), cv2.COLOR_RGBA2BGRA)
cv2.imwrite("tgi_good.png",tgi_f)





HD_rgb_tgi =  cv2.imread('bad_tif.tif',cv2.IMREAD_UNCHANGED)
red = HD_rgb_tgi[:,:,0].astype('float64')
green = HD_rgb_tgi[:,:,1].astype('float64')
blue = HD_rgb_tgi[:,:,2].astype('float64')
tgi=(-1) * 0.5 * ((200*(red-green))-(100 * (red-blue)))
tgi_normalized = ((tgi - np.amin(tgi)) / (np.amax(tgi) - np.amin(tgi)))
tgi_f = Image.fromarray(np.uint8(colors.ListedColormap([ '#C90000', '#CF630A'  , '#EBE42D', '#27FF0F','#0C750C'])(tgi_normalized) * 255))
tgi_f = tgi_f.convert('RGBA')
tgi_f=cv2.cvtColor(np.float32(tgi_f), cv2.COLOR_RGBA2BGRA)
cv2.imwrite("tgi_bad.png",tgi_f)

link 到 2 个 tif 图片:

https://mega.nz/file/2J0EzbKQ#wPFPr4onmRCwEvdOHyBCwLQnBMqPQYIsZucA8bNERBw https://mega.nz/file/DF0i2BTJ#HuzKxWI60-R0DjAB7lwuqkhOiO5Y8bgEFXUHkHfmwNE

抱歉,外部 links 但我无法将问题重现到其他图像。 最好的问候

即使不可见,显然照片的直方图也不相同。将 cv2.equalizeHist 应用于不良图像似乎可以解决问题。

import cv2
import numpy as np
from PIL import Image
from matplotlib import colors


HD_rgb_tgi =  cv2.imread('good_tif.tif',cv2.IMREAD_UNCHANGED)#odm_orthophoto
red = HD_rgb_tgi[:,:,0].astype('float64')
green = HD_rgb_tgi[:,:,1].astype('float64')
blue = HD_rgb_tgi[:,:,2].astype('float64')
tgi=(-1) * 0.5 * ((200*(red-green))-(100 * (red-blue)))
tgi_normalized = ((tgi - np.amin(tgi)) / (np.amax(tgi) - np.amin(tgi)))
tgi_f = Image.fromarray(np.uint8(colors.ListedColormap([ '#C90000', '#CF630A'  , '#EBE42D', '#27FF0F', '#0C750C'])(tgi_normalized) * 255))
tgi_f = tgi_f.convert('RGBA')
tgi_f=cv2.cvtColor(np.float32(tgi_f), cv2.COLOR_RGBA2BGRA)
cv2.imwrite("tgi_good.png",tgi_f)


def run_histogram_equalization(image_path):
    rgb_img = cv2.imread(image_path)
    # convert from RGB color-space to YCrCb
    ycrcb_img = cv2.cvtColor(rgb_img, cv2.COLOR_BGR2YCrCb)
    # equalize the histogram of the Y channel
    ycrcb_img[:, :, 0] = cv2.equalizeHist(ycrcb_img[:, :, 0])
    # convert back to RGB color-space from YCrCb
    equalized_img = cv2.cvtColor(ycrcb_img, cv2.COLOR_YCrCb2BGR)
    cv2.imwrite('res.png',equalized_img)

run_histogram_equalization('bad_tif.tif')


D_rgb_tgi =  cv2.imread('res.png',cv2.IMREAD_UNCHANGED)#odm_orthophoto
red = HD_rgb_tgi[:,:,0].astype('float64')
green = HD_rgb_tgi[:,:,1].astype('float64')
blue = HD_rgb_tgi[:,:,2].astype('float64')
tgi=(-1) * 0.5 * ((200*(red-green))-(100 * (red-blue)))
tgi_normalized = ((tgi - np.amin(tgi)) / (np.amax(tgi) - np.amin(tgi)))
tgi_f = Image.fromarray(np.uint8(colors.ListedColormap([ '#C90000', '#CF630A'  , '#EBE42D', '#27FF0F', '#0C750C'])(tgi_normalized) * 255))
tgi_f = tgi_f.convert('RGBA')
tgi_f=cv2.cvtColor(np.float32(tgi_f), cv2.COLOR_RGBA2BGRA)
cv2.imwrite("tgi_bad.png",tgi_f)