<p><a href="https://i.stack.imgur.com/1jVhb.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/1jVhb.jpg" alt="enter image description here"/></a>
<a href="https://i.stack.imgur.com/0KPSK.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/0KPSK.png" alt="enter image description here"/></a></p>
<p>亮度和对比度可分别使用α(α)和β(β)进行调整。表达式可以写成</p>
<p><a href="https://i.stack.imgur.com/75Xst.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/75Xst.png" alt="enter image description here"/></a></p>
<p>OpenCV已经将其实现为<a href="https://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#convertscaleabs" rel="nofollow noreferrer">^{<cd1>}</a>,因此我们可以将此函数与用户定义的<code>alpha</code>和<code>beta</code>值一起使用。</p>
<pre><code>import cv2
import numpy as np
from matplotlib import pyplot as plt
image = cv2.imread('1.jpg')
alpha = 1.95 # Contrast control (1.0-3.0)
beta = 0 # Brightness control (0-100)
manual_result = cv2.convertScaleAbs(image, alpha=alpha, beta=beta)
cv2.imshow('original', image)
cv2.imshow('manual_result', manual_result)
cv2.waitKey()
</code></pre>
<p>但问题是</p>
<blockquote>
<p>How to get an automatic brightness/contrast optimization of a color photo?</p>
</blockquote>
<p>本质上,问题是如何自动计算<code>alpha</code>和<code>beta</code>。为此,我们可以查看图像的直方图。自动亮度和对比度优化计算alpha和beta,以便输出范围为<code>[0...255]</code>。我们计算累积分布来确定颜色频率低于某个阈值(比如1%)的位置,并剪切直方图的左右两侧。这给了我们最小和最大的范围。这是一个可视化的直方图之前(蓝色)和之后剪辑(橙色)。请注意,在剪切之后,图像中更“有趣”的部分是如何发音的。</p>
<p><img src="https://i.stack.imgur.com/bBX7c.png" width="400"/></p>
<p>为了计算<code>alpha</code>,我们在剪切后取最小和最大灰度范围,并将其与期望的输出范围<code>255</code>分开</p>
<pre><code>α = 255 / (maximum_gray - minimum_gray)
</code></pre>
<p>为了计算beta,我们将其插入公式中,其中<code>g(i, j)=0</code>和<code>f(i, j)=minimum_gray</code></p>
<pre><code>g(i,j) = α * f(i,j) + β
</code></pre>
<p>在解决了这个问题之后</p>
<pre><code>β = -minimum_gray * α
</code></pre>
<p>为了你的形象我们得到了这个</p>
<blockquote>
<p>Alpha: 3.75</p>
<p>Beta: -311.25</p>
</blockquote>
<p>可能需要调整剪裁阈值以优化结果。下面是对其他图像使用1%阈值的一些示例结果</p>
<p><img src="https://i.stack.imgur.com/xOrL1.jpg" width="300"/>
<img src="https://i.stack.imgur.com/THfxY.png" width="300"/></p>
<p><img src="https://i.stack.imgur.com/aJQuc.jpg" width="270"/>
<img src="https://i.stack.imgur.com/fVTK9.png" width="270"/></p>
<p>自动亮度和对比度代码</p>
<pre><code>import cv2
import numpy as np
from matplotlib import pyplot as plt
# Automatic brightness and contrast optimization with optional histogram clipping
def automatic_brightness_and_contrast(image, clip_hist_percent=1):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Calculate grayscale histogram
hist = cv2.calcHist([gray],[0],None,[256],[0,256])
hist_size = len(hist)
# Calculate cumulative distribution from the histogram
accumulator = []
accumulator.append(float(hist[0]))
for index in range(1, hist_size):
accumulator.append(accumulator[index -1] + float(hist[index]))
# Locate points to clip
maximum = accumulator[-1]
clip_hist_percent *= (maximum/100.0)
clip_hist_percent /= 2.0
# Locate left cut
minimum_gray = 0
while accumulator[minimum_gray] < clip_hist_percent:
minimum_gray += 1
# Locate right cut
maximum_gray = hist_size -1
while accumulator[maximum_gray] >= (maximum - clip_hist_percent):
maximum_gray -= 1
# Calculate alpha and beta values
alpha = 255 / (maximum_gray - minimum_gray)
beta = -minimum_gray * alpha
'''
# Calculate new histogram with desired range and show histogram
new_hist = cv2.calcHist([gray],[0],None,[256],[minimum_gray,maximum_gray])
plt.plot(hist)
plt.plot(new_hist)
plt.xlim([0,256])
plt.show()
'''
auto_result = cv2.convertScaleAbs(image, alpha=alpha, beta=beta)
return (auto_result, alpha, beta)
image = cv2.imread('1.jpg')
auto_result, alpha, beta = automatic_brightness_and_contrast(image)
print('alpha', alpha)
print('beta', beta)
cv2.imshow('auto_result', auto_result)
cv2.waitKey()
</code></pre>
<p>带有此代码的结果图像:</p>
<p><a href="https://i.stack.imgur.com/1jVhb.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/1jVhb.jpg" alt="enter image description here"/></a>
<img src="https://i.stack.imgur.com/PEUxdm.jpg" alt=""/></p>
<p>使用1%阈值的其他图像的结果</p>
<p><a href="https://i.stack.imgur.com/jtD9q.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/jtD9q.jpg" alt="enter image description here"/></a>
<a href="https://i.stack.imgur.com/bURHD.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/bURHD.png" alt="enter image description here"/></a></p>
<p><a href="https://i.stack.imgur.com/JRdmT.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/JRdmT.jpg" alt="enter image description here"/></a>
<a href="https://i.stack.imgur.com/KSfBn.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/KSfBn.png" alt="enter image description here"/></a></p>