2017-07-28 143 views
0

我希望能夠修復我所有圖像的不均勻亮度/亮度(希望獲得所有亮度)。 獲取我的循環圖像亮度通道的差異到我的參考圖像後。我添加了差異並將其保存到新圖像中......但是,在檢查新圖像後,我意識到我仍然得到不均勻的亮度......我的編碼有什麼問題嗎?任何幫助或更正讚賞。我在LAB和HSV colorspace上都試過這個代碼,仍然是一樣的。下面是我得到的代碼和一些結果。OpenCV_Python:亮度通道操作,試圖讓所有圖像具有相同的亮度

from PIL import Image 
import numpy as np 
import cv2 


path = 'R:\\Temp\\zzzz\\AlignedPhoto_in_PNG\\' 
path1 = 'R:\\Temp\\zzzz\\Testing1\\' 


img = cv2.imread(path + 'aligned_IMG_1770.png') 
img = cv2.cvtColor(img, cv2.COLOR_BGR2LAB) 
a = np.mean(img[:,:,0]) 

for i in range (1770,1869): 
    img1 = cv2.imread(path + 'aligned_IMG_%d.png'%(i)) 
    img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2LAB) 
    img1[:,:,0], img1[:,:,1], img1[:,:,2] = cv2.split(img1) 
    print(img1[:,:,0]) 
    b = np.mean(img1[:,:,0]) 
    diff= b-a 
    print(diff) 
    img1[:,:,0] = img1[:,:,0] + diff 
    img1 = cv2.merge([img1[:,:,0], img1[:,:,1], img1[:,:,2]]) 
    print(img1[:,:,0]) 
    img1 = cv2.cvtColor(img1, cv2.COLOR_LAB2BGR) 
    cv2.imwrite(path1 + 'Testing1_%d.png'%(i), img1) 

此外,在如何修改現有代碼的任何指導,以將差值後確認,新值不超過LAB的最大/最小範圍內亮度通道的或最大/最小範圍價值渠道在HSV?添加後我意識到如果新值大於255,值跳到從1開始計數。我搜索瞭如何解決這個問題或設置範圍,但我明白如何去做

下面是幾張圖片我從上面的代碼得到的結果。希望有助於確定我的代碼出了什麼問題,因爲在添加差異後,新圖像的亮度仍然不均勻。

[[ 39 39 39 ..., 38 38 36] 
[ 39 38 39 ..., 39 39 39] 
[ 40 40 40 ..., 39 39 39] 
..., 
[119 119 122 ..., 165 166 167] 
[118 118 120 ..., 169 166 166] 
[115 116 117 ..., 175 169 167]] 
0.0 
[[ 39 39 39 ..., 38 38 36] 
[ 39 38 39 ..., 39 39 39] 
[ 40 40 40 ..., 39 39 39] 
..., 
[119 119 122 ..., 165 166 167] 
[118 118 120 ..., 169 166 166] 
[115 116 117 ..., 175 169 167]] 
[[ 0 0 0 ..., 0 0 0] 
[ 0 0 0 ..., 0 0 0] 
[ 0 0 0 ..., 0 0 0] 
..., 
[117 119 119 ..., 165 163 131] 
[117 117 118 ..., 170 166 131] 
[115 116 116 ..., 176 171 134]] 
-1.48181156101 
[[255 255 255 ..., 255 255 255] 
[255 255 255 ..., 255 255 255] 
[255 255 255 ..., 255 255 255] 
..., 
[115 117 117 ..., 163 161 129] 
[115 115 116 ..., 168 164 129] 
[113 114 114 ..., 174 169 132]] 
[[ 0 0 0 ..., 0 0 0] 
[ 0 0 0 ..., 0 0 0] 
[ 0 0 0 ..., 0 0 0] 
..., 
[ 0 97 115 ..., 165 164 165] 
[ 0 96 114 ..., 169 166 164] 
[ 0 95 113 ..., 175 170 166]] 
-3.69765536832 
[[253 253 253 ..., 253 253 253] 
[253 253 253 ..., 253 253 253] 
[253 253 253 ..., 253 253 253] 
..., 
[253 93 111 ..., 161 160 161] 
[253 92 110 ..., 165 162 160] 
[253 91 109 ..., 171 166 162]] 
+0

不要覺得太複雜。如果你計算一個偏移量,你會得到錯誤的結果。首先要做的就是用一個例子來檢查你的偏移量計算。或者只是想想如果a比b更明亮會發生什麼......不要讓其他人爲你考慮 – Piglet

+0

@Piglet差異將是差異= a - b即使我將我的第一個圖像亮度這是一個我的參考亮度值? – SacreD

+0

@Piglet我還是不明白如何在通道範圍內設置像素的上限......真的有任何例子對我理解和學習真的很有幫助。我通過例子/實踐學到了最多,因爲有時候我不明白我什麼時候通過文檔或理論 – SacreD

回答

1

這就是爲什麼數學是每個程序員都應具備的技能。

您通過添加差異來改正亮度。

所以,如果你想有一個等於b的總和和差異

a = b + diff 

,你知道並。那麼你如何得到差異?

diff = a - b 

diff = b - a 

否則你會較暗的圖像暗,明亮的影像,而不是明亮的把他們給您參考的意思是......使用全局偏移會導致

當然像素超出您的價值範圍的問題。你必須解決這個問題。否則,你的新意思就會錯誤。

+0

即使我將我的第一張圖像亮度作爲我的參考亮度值,diff也會是diff = a - b? – SacreD

+1

@SacreD我不明白你的意思。在你的代碼圖片中a是你的參考。圖像b會改變您的循環中的每個圖像。如果圖像b比亮度要亮,則必須降低其亮度以獲得與b相同的亮度,因此您的偏移量必須爲負值。如果你這樣做你的抵消是積極的,你會得到一個更加明亮的圖像... – Piglet