web-dev-qa-db-ja.com

opencvを使用して画像のコントラストと明るさを等しくするにはどうすればよいですか?

スキャンした画像がありますが、白い紙が画面に白くありません。背景を白くするために契約/明るさを均一にする方法はありますか?

更新

EmguCvから提案されたImage._EqualizeHist関数を試しました。

string file = @"IMG_20120512_055533.jpg";
Image<Bgr, byte> originalColour = new Image<Bgr, byte>(file);

Image<Bgr, byte> improved = originalColour.Clone();
improved._EqualizeHist();

しかし、さらに悪い結果が得られます(最初にグレースケールした場合も)。

他のパラメータがありませんか?

13
tofi9

ここでいくつかのテクニックについて説明しました: CのOpenCVでコントラストを調整するにはどうすればよいですか?

これをチェックしてください。以下は、画像で最後の2つの方法を試したときに得られた結果です。

1)しきい値

しきい値処理により、バイナリイメージが得られます。それが必要な場合は、threshold functionを適用できます

2)グレースケール画像が必要な場合

enter image description here

追加:

Morphological closingもあなたのケースでうまくいきます

img = cv2.imread('home.jpg',0)
kernel1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
close = cv2.morphologyEx(gray,cv2.MORPH_CLOSE,kernel1)
div = np.float32(gray)/(close)
res = np.uint8(cv2.normalize(div,div,0,255,cv2.NORM_MINMAX))

(コードインPython API)

以下の結果:

enter image description here

20
Abid Rahman K

AdaptiveThreshold を使用することをお勧めします。これは、画像内のすべてのピクセルに対してローカル近傍しきい値を実行することによって機能します(これは、画像よりも少し強い、グラデーションの背景がある場合に非常に重要です)。 blockSizeパラメータは近隣のサイズであり、処理されるピクセル値は、平均近隣値からparam1を引いた値よりも大きくなければなりません。

enter image description here

python(cに変換するのは非常に簡単なはずです)でそれを行う方法は次のとおりです。

import cv
im = cv.LoadImage("9jU1Um.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE)
cv.AdaptiveThreshold(im, im, 255, cv.CV_ADAPTIVE_THRESH_MEAN_C, 
                                  cv.CV_THRESH_BINARY, blockSize=31, param1=15)
cv.ShowImage('image', im)
cv.WaitKey(0)
6
fraxel

これはequalizeHistと呼ばれます。 emguでの名前はわかりませんが、結果はまさに必要なもの、つまり明るい背景と暗いテキストになるはずです。

[〜#〜]編集[〜#〜]

エッジのみを抽出するには(画像強調手法とは大きく異なります)、Cannyを適用するだけです。開始時に2つのしきい値を20と60として選択し、見栄えの良いエッジイメージが得られるまで、3:1の比率を維持しながら増加(または減少)します。

4
Sam

明るさとコントラストを変更するには、ピクセル値を乗算してから、それらに定数を追加します。 ( 画像のコントラストと明るさの変更 の詳細については、OpenCVドキュメントを参照してください。)

python and numpy:

_import cv2 as cv
import numpy as np

img = cv.imread('b.jpg',0) # loads in grayscale

alpha = 1
beta = 0
res = cv.multiply(img, alpha)
res = cv.add(res, beta)
_

次のものを使用することもできます。

_res = cv.convertScaleAbs(img, alpha = alpha, beta = beta)
_

画像では、ヒストグラムで最大値が約170であることを確認できます(img.max()を使用する場合、実際には172です)。したがって、画像に_255/172 = 1.48_を掛けて明るさを上げることができます。

以下の結果を参照してください。

enter image description here

そして、それぞれのヒストグラム:

enter image description here

4
Gustavo Kaneto