OpenCVで画像の明るさを自動的に調整する

OpenCVで画像の明るさを自動的に調整する image 2 Info

OpenCVで画像の明るさを自動的に調整する

タグ:




質問

OpenCVの特定の値に画像の明るさを調整したい。たとえば、次の画像を考えてみましょう。

私は明るさを次のように計算します:

import cv2
img = cv2.imread(filepath)
cols, rows = img.shape
brightness = numpy.sum(img) / (255 * cols * rows)

そして、私は平均明るさが35%になります。たとえば、66%にするには、次のようにします。

minimum_brightness = 0.66
alpha = brightness / minimum_brightness
bright_img = cv2.convertScaleAbs(img, alpha = alpha, beta = 255 * (1 – alpha))

そして、私は50%透明ベールを持っているようなイメージを取得します:

私はバイアスだけを使ってこの効果を避けることができます:

bright_img = cv2.convertScaleAbs(img, alpha = 1, beta = 128)

また、画像にはベールがあるようです。

たとえば、Photoshopで150で明るさ調整を行うと、結果は大丈夫です。

しかし、これは自動ではなく、目標の明るさを与えません。

より自然な結果のためにガンマ補正またはヒストグラム同等化のいずれかでそれを行うことができますが、trial-and-error以外のターゲットの明るさを取得する簡単な方法はありません。

ターゲットに自動的に明るさを調整することに成功した人はいますか?

更新

Kanatが提案した:

bright_img = cv2.convertScaleAbs(img, alpha = 1, beta = 255 * (minimum_brightness – brightness))

結果はより良いですが、まだベールがあります:

Yves Dautoloinはbeta = 0を維持することを提案したので、ターゲットの明るさを得るためにalpha = minimum_brightness / brightnessを調整しました:

ratio = brightness / minimum_brightness
if ratio >= 1:
print(“Image already bright enough”)
return img

# Otherwise, adjust brightness to get the target brightness
return cv2.convertScaleAbs(img, alpha = 1 / ratio, beta = 0)

OpenCVで画像の明るさを自動的に調整する image 1

結果は良いです:

ベストアンサー

ヒストグラムクリッピングでコントラスト最適化を使用して明るさを自動的に調整することができます。ヒストグラムクリップパーセント(clip_hist_percent)を増やすことで、ターゲットの明るさを増やすことができます。 25%のクリッピングの結果は次のとおりです

アルファとベータは自動的に計算されます

アルファ3.072289156626506

ベータ-144.3975903614458

ここにクリッピングの視覚化があります。青(オリジナル)、オレンジ(自動調整後)。

クリッピングが35%の結果

アルファ3.8059701492537314

ベータ-201.71641791044777

他の方法は、 Histogram方程式またはCLAHE を使用することができます。

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=25):
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)

OpenCVで画像の明るさを自動的に調整する image 0

image = cv2.imread(‘1.png’)
auto_result, alpha, beta = automatic_brightness_and_contrast(image)
print(‘alpha’, alpha)
print(‘beta’, beta)
cv2.imshow(‘auto_result’, auto_result)
cv2.imwrite(‘auto_result.png’, auto_result)
cv2.imshow(‘image’, image)
cv2.waitKey()







source
画像の明るさのコントラストとガンマを調整する
画像の明るさを効率的に調整する方法
Python + OpenCVで画像の明るさを高速に変更するには?
OpenCVを使用した紙のカラー写真の自動コントラストと明るさの調整
iphoneシミュレータの明るさは調整可能ですか?
JavaでBufferedImageの明るさとコントラストを調整する
明るさを調整するために画像内のピクセルを拡大縮小する方法は?
色の明るさを調整するにはどうすればよいですか?
C#を使用して画面の明るさを調整する
プログラムで画面の明るさを調整する方法はありますか?
Rating