スキャンした画像がありますが、白い紙が画面に白くありません。背景を白くするために契約/明るさを均一にする方法はありますか?
更新
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();
しかし、さらに悪い結果が得られます(最初にグレースケールした場合も)。
他のパラメータがありませんか?
ここでいくつかのテクニックについて説明しました: CのOpenCVでコントラストを調整するにはどうすればよいですか?
これをチェックしてください。以下は、画像で最後の2つの方法を試したときに得られた結果です。
1)しきい値:
しきい値処理により、バイナリイメージが得られます。それが必要な場合は、threshold function
を適用できます
2)グレースケール画像が必要な場合:
追加:
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)
以下の結果:
AdaptiveThreshold を使用することをお勧めします。これは、画像内のすべてのピクセルに対してローカル近傍しきい値を実行することによって機能します(これは、画像よりも少し強い、グラデーションの背景がある場合に非常に重要です)。 blockSize
パラメータは近隣のサイズであり、処理されるピクセル値は、平均近隣値からparam1
を引いた値よりも大きくなければなりません。
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)
これはequalizeHistと呼ばれます。 emguでの名前はわかりませんが、結果はまさに必要なもの、つまり明るい背景と暗いテキストになるはずです。
[〜#〜]編集[〜#〜]
エッジのみを抽出するには(画像強調手法とは大きく異なります)、Cannyを適用するだけです。開始時に2つのしきい値を20と60として選択し、見栄えの良いエッジイメージが得られるまで、3:1の比率を維持しながら増加(または減少)します。
明るさとコントラストを変更するには、ピクセル値を乗算してから、それらに定数を追加します。 ( 画像のコントラストと明るさの変更 の詳細については、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
_を掛けて明るさを上げることができます。
以下の結果を参照してください。
そして、それぞれのヒストグラム: