偶然發現了一個非常奇怪的問題。我從 agro 影像創建了一個 tgi 影像。雖然我有兩個非常相似的 agro 影像,顏色幾乎相同,但其中一個 tif 檔案產生了一個很好的 tgi 影像,但另一個產生了一個全黃色的 tgi 影像.我在我認為我的代碼錯誤的地方應用了一個 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)
鏈接到 2 個 tif 圖片:
https://mega.nz/file/2J0EzbKQ#wPFPr4onmRCwEvdOHyBCwLQnBMqPQYIsZucA8bNERBw https://mega.nz/file/DF0i2BTJ#HuzKxWI60-R0DjAB7lwuqkhOiO5Y8bgEFXUHkHfmwNE
很抱歉外部鏈接,但我無法將問題重現到其他影像。最好的祝福
uj5u.com熱心網友回復:
即使不可見,顯然照片的直方圖也不相同。應用于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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/432794.html
標籤:Python opencv matplotlib python成像库
