画像の明るさのOpenCVのコントラストを調整します

画像処理

画像変換関数を見つけることで、対象画像マトリックスに変換処理後の原画像マトリックスの機能は、  
二つの方法、即ち、変換画素レベルの地域レベル変換に分けることができます。

  • 点演算子(画素変換)
  • 近傍(面積ベース)演算子

変換画素レベル等価\(P_後} {(I、J)= F({前} P_(I、J))\) 即ち、変換後の各画素値を変換前と同じ位置であり、ピクセル値は、関数マッピング関係です。

コントラストと明るさの変化

線形変換  

最も一般的に使用される線形変換です。その\(CDOT F(I、J)+ \ベータ\ \ G(I、J)= \アルファ)
F(I、J)は、元の画素値、G(i、j)は変換後の画素値である。
\ (\アルファ\)は、コントラスト調整する\(\ベータ\)を、時にはバイアスおよび利得パラメータと呼ばれる。明るさを調整します。

どのようなコントラスト?「光と闇の間の差は、」しないということ?すなわち、画素値の大きさとの差です。私は、アルファが小さい場合、輝度増幅値の差、すなわち、コントラストを増大したときに、アルファ時間が大きい場合には、明るさの差がコントラストが低減され、低減され、因子αを乗じました。

ベータより良い理解に加え、画素の輝度値に直接数、正の数は、輝度、明るさを減少させる負の数を増加させることです。

次のコードの例を見てみると:

from __future__ import print_function
from builtins import input
import cv2 as cv
import numpy as np
import argparse
# Read image given by user
parser = argparse.ArgumentParser(description='Code for Changing the contrast and brightness of an image! tutorial.')
parser.add_argument('--input', help='Path to input image.', default='lena.jpg')
args = parser.parse_args()
image = cv.imread(cv.samples.findFile(args.input))
if image is None:
    print('Could not open or find the image: ', args.input)
    exit(0)
new_image = np.zeros(image.shape, image.dtype)
alpha = 1.0 # Simple contrast control
beta = 0    # Simple brightness control
# Initialize values
print(' Basic Linear Transforms ')
print('-------------------------')
try:
    alpha = float(input('* Enter the alpha value [1.0-3.0]: '))
    beta = int(input('* Enter the beta value [0-100]: '))
except ValueError:
    print('Error, not a number')
# Do the operation new_image(i,j) = alpha*image(i,j) + beta
# Instead of these 'for' loops we could have used simply:
# new_image = cv.convertScaleAbs(image, alpha=alpha, beta=beta)
# but we wanted to show you how to access the pixels :)
for y in range(image.shape[0]):
    for x in range(image.shape[1]):
        for c in range(image.shape[2]):
            new_image[y,x,c] = np.clip(alpha*image[y,x,c] + beta, 0, 255)
cv.imshow('Original Image', image)
cv.imshow('New Image', new_image)
# Wait until user press some key
cv.waitKey()

ヒントモジュール「CV2」には属性「サンプル」は、最初のインストールはOpenCVの-pythonの== 4.0.0.21をインストールPIPを持っていません。

実行します:python change_brightness_contrast.py --input ./lights.jpeg

図は、α= 2、β= 20、レンダリングです。

非線形変換

線形変換がかろうじて見える雲につながる、改善しつつ、上記α= 1.3、β= 40、元の画像の明るさを示すように、あなたが見たい場合は、問題であるかの雲、建物、十分な明るさ​​。

このとき非線形変換を導入する。補正はガンマと呼ばれる
\(= O \ \ FRAC I {255} {}(左\右)^ {\ガンマ} \タイムズ255 \)が
異なる線形変換と、異なります強度変化とは異なる元の輝度値は、非線形です。

場合γ<1、画像の明るさが増加します。> 1、明るさを減少させます。

γ= 0.4、図において上述の変化の影響。雲と構造はまだ明らかように、画像のコントラストを維持しつつ、明るく見ることができます。


あなたは別の階調変換を見れば、ヒストグラム場合は見ることができます。ヒストグラムの中央の画像は低輝度画素値の多くを見ることができます。
左、右、全体のヒストグラム生成の線形変換を行われていますシフト、及び各画素は255でのピークは、雲が青色明るすぎると区別できないもたらした。明るさのものが増加している。
部は低輝度値であることがあっても、右画像の明るさはガンマ補正のより均一な分布をしました強化が、そうではない露出オーバーには雲が区別できます。

ガンマ補正コードの実装は、以下の通りです。

    lookUpTable = np.empty((1,256), np.uint8)
    for i in range(256):
        lookUpTable[0,i] = np.clip(pow(i / 255.0, gamma) * 255.0, 0, 255)
    res = cv.LUT(img_original, lookUpTable)

変換関数であるCv.LUT。ルックアップテーブルは、新たな画像マトリクスを生成するために、内部からの関係を変換見出さ。Https://docs.opencv.org/master/d2/de8/group__core__array.html#gab55b8d062b7f5587720ede032d34156f

参考:https://docs.opencv.org/master/d3/dc1/tutorial_basic_linear_transform.html

おすすめ

転載: www.cnblogs.com/sdu20112013/p/11597171.html