大家好,我有一張上面有白色覆寫層的影像,我正在嘗試均衡顏色,或者換句話說,洗掉白色覆寫層,使其成為一種顏色。我是影像處理的新手,我想也許可以提取顏色通道,然后使用均衡直方圖,如果可行的話?什么是最好的方法?謝謝!

uj5u.com熱心網友回復:
這是我最好的嘗試:

參考區域的灰度直方圖和要修復的區域:

你看,與白色的混合導致直方圖被擠壓并向右移動。原始值 255 被映射到 255,但原始值越暗,它就越亮。遮罩區域包含推測為黑色(靠背)的樣本,這些樣本在未觸及的參考區域中也是黑色的,因此我們可以估計發生了什么......原始黑色被映射到 ~88 的灰度值。
我在兩個光譜中找到最小值并將它們用于線性映射:
refmax = 255
refmin = gray[~mask].min()
fixmax = 255
fixmin = gray[mask].min()
composite = im.copy()
composite[mask] = np.clip((composite[mask] - fixmin) / (fixmax - fixmin) * (refmax - refmin) refmin, 0, 255)
就是這樣。
uj5u.com熱心網友回復:
這是將內部區域的平均值與外部區域的平均值相匹配的簡單嘗試。它不能很好地作業,因為它是全域變化并且沒有考慮整個影像的亮度變化。但是你可以開始玩它。
它采用蒙版影像并獲取內部和外部區域的均值。然后得到差值并從內部區域中減去。
輸入:

import cv2
import numpy as np
# load image
img = cv2.imread('writer.jpg', cv2.IMREAD_GRAYSCALE)
# rectangle coordinates
x = 61
y = 8
w = 663
h = 401
# create mask for inner area
mask = np.zeros_like(img, dtype=np.uint8)
mask[y:y h, x:x w] = 255
# compute means of inner rectangle region and outer region
mean_inner = np.mean(img[np.where(mask == 255)])
mean_outer = np.mean(img[np.where(mask == 0)])
# compute difference in mean values
bias = 0
diff = mean_inner - mean_outer bias
# print mean of each
print("mean of inner region:", mean_inner)
print("mean of outer region:", mean_outer)
print("difference:", diff)
# subtract diff from img
img_diff = cv2.subtract(img, diff)
# blend with original using mask
result = np.where(mask==255, img_diff, img)
# save resulting masked image
cv2.imwrite('writer_balanced.jpg', result)
# show results
cv2.imshow("IMAGE", img)
cv2.imshow("MASK", mask)
cv2.imshow("RESULT", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
mean of inner region: 195.44008004122423
mean of outer region: 154.1415758021116
difference: 41.298504239112646
結果:

您可以更改偏差以使內部區域整體更亮或更暗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/313192.html
