如何在 OpenCV 中调整图像部分的亮度
How do I adjust the luminance in a section of an image in OpenCV
我有下图。
如果我将平均亮度绘制为 x 像素位置的函数,我可以看到图像的中心比边缘更亮。
我想使用 OpenCV 更正此问题,使整个图像的亮度相同。这可能吗?
编辑:到目前为止我的代码是
import cv2
import pylab
img = cv2.imread('3.jpeg', 1)
cv2.imshow("img",img)
lab= cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
cv2.imshow("lab",lab)
l, a, b = cv2.split(lab)
values = []
for c in xrange(l.shape[1]):
count = 0
for r in xrange(l.shape[0]):
count += l[r][c]
values.append(1.0 * count / l.shape[0])
pylab.figure()
pylab.ylabel('Average Luminance')
pylab.xlabel('X axis')
pylab.plot(values, 'k-')
pylab.show()
我有一个方法,但我今天不想为它编写任何代码,更糟糕的是,我不会说 Python。不过看你是怎么判断亮度不均匀的,自己码一下就清楚了。
首先,我会进入 Lab 模式(就像您已经做的那样),然后拆分频道。保留 a
和 b
通道以供以后重建。
现在使用 Lightness
(L
) 通道并用大半径模糊它 - 这将消除所有高频变化并仅保留您要消除的低频变化。假设新的模糊通道在最小值 110 和最大值 125 之间变化。从所有值中减去 110,现在图像中每个位置的值都在 0 到 15 之间。
现在从原始的、未模糊的 Lightness
通道中减去 0..15 之间的值以删除 low-frequency 变化,然后将修改后的亮度与原始的 a
和 b
个频道。
我希望你说得够清楚了 - 如果还不清楚,请尽管问!
与构建抛物线匹配光线 fall-off 相比,此方法的优势在于,无论亮度随 x、随 y、沿对角线或其他方式变化,它都会起作用。
我有下图。
如果我将平均亮度绘制为 x 像素位置的函数,我可以看到图像的中心比边缘更亮。
我想使用 OpenCV 更正此问题,使整个图像的亮度相同。这可能吗?
编辑:到目前为止我的代码是
import cv2
import pylab
img = cv2.imread('3.jpeg', 1)
cv2.imshow("img",img)
lab= cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
cv2.imshow("lab",lab)
l, a, b = cv2.split(lab)
values = []
for c in xrange(l.shape[1]):
count = 0
for r in xrange(l.shape[0]):
count += l[r][c]
values.append(1.0 * count / l.shape[0])
pylab.figure()
pylab.ylabel('Average Luminance')
pylab.xlabel('X axis')
pylab.plot(values, 'k-')
pylab.show()
我有一个方法,但我今天不想为它编写任何代码,更糟糕的是,我不会说 Python。不过看你是怎么判断亮度不均匀的,自己码一下就清楚了。
首先,我会进入 Lab 模式(就像您已经做的那样),然后拆分频道。保留 a
和 b
通道以供以后重建。
现在使用 Lightness
(L
) 通道并用大半径模糊它 - 这将消除所有高频变化并仅保留您要消除的低频变化。假设新的模糊通道在最小值 110 和最大值 125 之间变化。从所有值中减去 110,现在图像中每个位置的值都在 0 到 15 之间。
现在从原始的、未模糊的 Lightness
通道中减去 0..15 之间的值以删除 low-frequency 变化,然后将修改后的亮度与原始的 a
和 b
个频道。
我希望你说得够清楚了 - 如果还不清楚,请尽管问!
与构建抛物线匹配光线 fall-off 相比,此方法的优势在于,无论亮度随 x、随 y、沿对角线或其他方式变化,它都会起作用。