OpenCV_Python:亮度通道操作,试图使所有图像具有相同的亮度
OpenCV_Python: Lightness Channel Manipulation, Trying to get same brightness to all images
我希望修复我所有图像的不均匀 brightness/lightness(希望获得所有亮度)。
在将循环图像的亮度通道与参考图像进行对比后。我添加了差异并将其保存到新图像中......但是在检查新图像后,我意识到我的亮度仍然不均匀......我的编码有什么问题吗???任何帮助或更正表示赞赏。我已经在 LAB 和 HSV 颜色空间上尝试了这段代码,仍然是一样的。下面是我得到的代码和一些结果。
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 中亮度通道的 max/min 范围或 max/min 的任何指导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]]
这就是为什么数学是每个程序员都应该具备的技能。
您通过添加差异校正亮度。
所以如果你想让 a 等于 b 和 diff
a = b + diff
你知道并且是。那你怎么得到差异?
diff = a - b
不是
diff = b - a
否则,您会使较暗的图像变暗,使较亮的图像变亮,而不是将它们带到您的参考平均值中...
当然,使用全局偏移会导致像素超出您的取值范围的问题。您必须解决此问题。否则你的新平均值将是错误的。
我希望修复我所有图像的不均匀 brightness/lightness(希望获得所有亮度)。 在将循环图像的亮度通道与参考图像进行对比后。我添加了差异并将其保存到新图像中......但是在检查新图像后,我意识到我的亮度仍然不均匀......我的编码有什么问题吗???任何帮助或更正表示赞赏。我已经在 LAB 和 HSV 颜色空间上尝试了这段代码,仍然是一样的。下面是我得到的代码和一些结果。
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 中亮度通道的 max/min 范围或 max/min 的任何指导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]]
这就是为什么数学是每个程序员都应该具备的技能。
您通过添加差异校正亮度。
所以如果你想让 a 等于 b 和 diff
a = b + diff
你知道并且是。那你怎么得到差异?
diff = a - b
不是
diff = b - a
否则,您会使较暗的图像变暗,使较亮的图像变亮,而不是将它们带到您的参考平均值中...
当然,使用全局偏移会导致像素超出您的取值范围的问题。您必须解决此问题。否则你的新平均值将是错误的。