web-dev-qa-db-ja.com

Python OpenCVで画像のコントラストを上げる方法

私はPython OpenCVを初めて使用しています。いくつかのドキュメントと回答を読みました ここ ですが、次のコードの意味がわかりません。

_if (self.array_alpha is None):
    self.array_alpha = np.array([1.25])
    self.array_beta = np.array([-100.0])

# add a beta value to every pixel 
cv2.add(new_img, self.array_beta, new_img)                    

# multiply every pixel value by alpha
cv2.multiply(new_img, self.array_alpha, new_img)  
_

そのことを知るようになりました_Basically, every pixel can be transformed as X = aY + b where a and b are scalars._。基本的に、私はこれを理解しました。しかし、私はコードとこれとのコントラストを上げる方法を理解していませんでした。

これまでは、img = cv2.imread('image.jpg',0)を使用して画像を簡単に読み取ることができました。

ご協力いただきありがとうございます

18
tsaebeht

LABカラーチャンネルを使った方法を提案したいと思います。ウィキペディアには、LABカラーチャンネルについて十分な情報があります。

OpenCV 3.0.0とpythonを使用して次のことを行いました。

import cv2

#-----Reading the image-----------------------------------------------------
img = cv2.imread('Dog.jpg', 1)
cv2.imshow("img",img) 

#-----Converting image to LAB Color model----------------------------------- 
lab= cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
cv2.imshow("lab",lab)

#-----Splitting the LAB image to different channels-------------------------
l, a, b = cv2.split(lab)
cv2.imshow('l_channel', l)
cv2.imshow('a_channel', a)
cv2.imshow('b_channel', b)

#-----Applying CLAHE to L-channel-------------------------------------------
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
cl = clahe.apply(l)
cv2.imshow('CLAHE output', cl)

#-----Merge the CLAHE enhanced L-channel with the a and b channel-----------
limg = cv2.merge((cl,a,b))
cv2.imshow('limg', limg)

#-----Converting image from LAB Color model to RGB model--------------------
final = cv2.cvtColor(limg, cv2.COLOR_LAB2BGR)
cv2.imshow('final', final)

#_____END_____#

そのままコードを実行できます。 CLAHE(コントラスト制限適応ヒストグラムイコライゼーション)について理解するには、ウィキペディアをもう一度確認してください。

36
Jeru Luke

\\この投稿は元の投稿から大幅に編集されています。元の回答のカーネルは以下のメモに保存されています\\

Pythonの場合、コントラストを提供するOpenCV関数は見つかりませんでした。他の人が示唆しているように、自動的にコントラストを上げるいくつかのテクニックがあります。

公式OpenCVドキュメント では、この方程式を使用してコントラストと明るさの両方を同時に適用できることが推奨されています。

new_img = alpha * old_img + beta

ここで、アルファはコントラストに対応し、ベータは明るさです。さまざまなケース

alpha 1  beta 0      --> no change  
0 < alpha < 1        --> lower contrast  
alpha > 1            --> higher contrast  
-127 < beta < +127   --> good range for brightness values

C/C++では、cv :: Mat :: convertToを使用してこの方程式を実装できますが、Pythonからライブラリのその部分にアクセスすることはできません。 Pythonでこれを行うには、 cv :: addWeighted 関数を使用することをお勧めします。この関数は高速で、出力を0から255の範囲に自動的に強制します(たとえば、24ビットのカラー画像の場合)。 、チャネルあたり8ビット)。

import cv2
img = cv2.imread('input.png')
# call addWeighted function. use beta = 0 to effectively only operate one one image
out = cv2.addWeighted( img, contrast, img, 0, brightness)
output = cv2.addWeighted

>>>>>メモの開始<<<<<

最初に投稿したように、このオンラインGIMPブックからこの式を参照しました]( http://pippin.gimp.org/image_processing/chap_point.html )は

new_image =(old_image-0.5)×コントラスト+ 0.5

コントラストスケールを-127から+127に変更するためのこの変更された式:

new_image =(old_image)×(contrast/127 + 1)-コントラスト

これらの式は、明るさとコントラストの両方の変化をもたらしますが、弱点があります。

  1. 2番目の式は最初の式から厳密に導出されていません
  2. 他のプログラム(PhotoShop、GIMPなど)で観察される明るさおよびコントラストの動作に対応していません。

>>>>> End Note <<<<<

ここからは、写真編集プログラムで一般的に見られる動作、具体的にはGIMPでの動作を再現してみます。

コントラスト

GIMPでは、コントラストレベルは-127から+127です。私は式 ここから をその範囲に合うように調整しました。

f = 131 *(コントラスト+ 127)/(127 *(131-コントラスト))
new_image = f *(old_image-127)+ 127 = f *(old_image)+ 127 *(1-f)

明るさを理解するために、明るさとレベルの関係を理解し​​、解決策に到達するために this levels post の情報を使用しました。

#pseudo code
if brightness > 0
    shadow = brightness
    highlight = 255
else:
    shadow = 0
    highlight = 255 + brightness
new_img = ((highlight - shadow)/255)*old_img + shadow

PythonおよびOpenCVの明るさとコントラスト

それをすべてまとめて、 SC SIPI からの参照「マンドリル」イメージを使用して追加します。

import cv2
import numpy as np

# Open a typical 24 bit color image. For this kind of image there are
# 8 bits (0 to 255) per color channel
img = cv2.imread('mandrill.png')  # mandrill reference image from USC SIPI

s = 128
img = cv2.resize(img, (s,s), 0, 0, cv2.INTER_AREA)

def apply_brightness_contrast(input_img, brightness = 0, contrast = 0):

    if brightness != 0:
        if brightness > 0:
            shadow = brightness
            highlight = 255
        else:
            shadow = 0
            highlight = 255 + brightness
        alpha_b = (highlight - shadow)/255
        gamma_b = shadow

        buf = cv2.addWeighted(input_img, alpha_b, input_img, 0, gamma_b)
    else:
        buf = input_img.copy()

    if contrast != 0:
        f = 131*(contrast + 127)/(127*(131-contrast))
        alpha_c = f
        gamma_c = 127*(1-f)

        buf = cv2.addWeighted(buf, alpha_c, buf, 0, gamma_c)

    return buf


font = cv2.FONT_HERSHEY_SIMPLEX
fcolor = (0,0,0)

blist = [0, -127, 127,   0,  0, 64] # list of brightness values
clist = [0,    0,   0, -64, 64, 64] # list of contrast values


out = np.zeros((s*2, s*3, 3), dtype = np.uint8)

for i, b in enumerate(blist):
    c = clist[i]
    print('b, c:  ', b,', ',c)
    row = s*int(i/3)
    col = s*(i%3)

    print('row, col:   ', row, ', ', col)

    out[row:row+s, col:col+s] = apply_brightness_contrast(img, b, c)
    msg = 'b %d' % b
    cv2.putText(out,msg,(col,row+s-22), font, .7, fcolor,1,cv2.LINE_AA)
    msg = 'c %d' % c
    cv2.putText(out,msg,(col,row+s-4), font, .7, fcolor,1,cv2.LINE_AA)

    cv2.putText(out, 'OpenCV',(260,30), font, 1.0, fcolor,2,cv2.LINE_AA)

cv2.imwrite('out.png', out)

enter image description here

GIMPで画像を手動で処理し、Python/OpenCVでテキストタグを追加しました。
enter image description here

注:@UtkarshBhardwajは、Python 2.xユーザーは、コントラスト補正計算コードを浮動小数点にキャストして次のような浮動結果:

...
if contrast != 0:
        f = float(131*(contrast + 127))/(127*(131-contrast))
...
15
bfris

明るさとコントラストは、それぞれアルファ(_α_)とベータ(_β_)を使用して調整できます。式は次のように書くことができます

enter image description here

OpenCVはこれを cv2.convertScaleAbs() としてすでに実装しています。ユーザー定義のalphabetaの値を提供するだけです

_import cv2

image = cv2.imread('1.jpg')

alpha = 1.5 # Contrast control (1.0-3.0)
beta = 0 # Brightness control (0-100)

adjusted = cv2.convertScaleAbs(image, alpha=alpha, beta=beta)

cv2.imshow('original', image)
cv2.imshow('adjusted', adjusted)
cv2.waitKey()
_

前_->_後

enter image description hereenter image description here

注:自動輝度/コントラスト調整については、 カラー写真の自動コントラストと輝度調整をご覧ください

8
nathancy

_X = aY + b_(実際にはf(x) = ax + b))の最良の説明は https://math.stackexchange.com/a/906280/357701 にあります

以下のようにコントラストの明るさ/輝度/明るさを調整するだけのシンプルなもの:

_import cv2

img = cv2.imread('test.jpg')
cv2.imshow('test', img)
cv2.waitKey(1000)
imghsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)


imghsv[:,:,2] = [[max(pixel - 25, 0) if pixel < 190 else min(pixel + 25, 255) for pixel in row] for row in imghsv[:,:,2]]
cv2.imshow('contrast', cv2.cvtColor(imghsv, cv2.COLOR_HSV2BGR))
cv2.waitKey(1000)
raw_input()
_
5
be_good_do_good