【问题标题】:OpenCV_Python: Lightness Channel Manipulation, Trying to get same brightness to all imagesOpenCV_Python:亮度通道操作,试图为所有图像获得相同的亮度
【发布时间】:2017-07-28 10:52:24
【问题描述】:

我希望修复我所有图像的不均匀亮度/亮度(希望获得所有亮度)。 在获得循环图像与参考图像的亮度通道差异之后。我添加差异并将其保存到新图像中......但是在检查新图像后,我意识到我仍然得到不均匀的亮度......我的编码有什么问题吗???任何帮助或更正表示赞赏。我在 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 中亮度通道的最大/最小范围或 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 更亮会发生什么......不要让其他人为你思考
  • @Piglet 即使我将第一张图像亮度作为参考亮度值,差异也会是 diff = a - b?
  • @Piglet 我仍然不明白如何将像素的上限设置在通道范围内......真的任何例子都对我的理解和学习很有帮助。我通过示例/实践学到最多,因为有时我在阅读文档或理论时不理解
  • 好吧,您只需使用 max(old value + diff, 255) 即可。和 min(0, oldvalue + diff)。但这会给你负值和高于 255 的值,因此你必须使用另一种数据类型并将图像缩放回字节值。否则你最终会得到一个错误的平均亮度。也许您应该只对一组值执行此操作,而不是对图像执行此操作。更容易理解。
  • @Piglet 我仍然得到不均匀的亮度结果。我确实注意到原始照片和编辑后的照片有所不同..但是看起来我正在使用全局校正值而不是自适应校正(我不知道如何)需要一些帮助来了解如何开始?跨度>

标签: python opencv image-processing colors brightness


【解决方案1】:

这就是为什么数学是每个程序员都应该具备的技能。

您可以通过添加差异来校正亮度。

所以如果你想让 a 等于 b 和 diff 的总和

a = b + diff

你知道a和be。那么你如何获得差异?

diff = a - b

不是

diff = b - a

否则,您将使较暗的图像更暗,更亮的图像更亮,而不是将它们带到您的参考平均值...

当然,使用全局偏移会导致超出您的值范围的像素出现问题。您必须解决此问题。否则你的新平均值将是错误的。

【讨论】:

  • 即使我将第一张图像亮度作为参考亮度值,差异也会是 diff = a - b?
  • @SacreD 我不明白你的意思。在您的代码图像中,a 是您的参考。图像 b 会随着循环中的每个图像而变化。如果图像 b 比 a 亮,则必须降低其亮度以获得与 b 相同的亮度,因此您的偏移量必须为负。如果您按照自己的方式进行操作,则偏移量是正的,并且您会获得更亮的图像...
猜你喜欢
  • 2020-04-04
  • 2021-07-04
  • 2011-06-20
  • 2020-10-23
  • 2012-02-03
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 2012-12-03
相关资源
最近更新 更多