2012-05-12 928 views
10

我已經掃描了一張圖像,但白色的紙張不是白色的。有沒有一種方法來平衡合同/亮度以使背景變白?如何使用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(); 

卻得到一個更糟糕的結果(也當最初的灰度縮放):

我是否缺少其他參數?

+1

Stack Overflow提供免費的圖像託管服務,只需點擊工具欄上的圖像按鈕,並將其指向您網站上本地計算機上託管的圖像。這實際上傳並鏡像圖像的一個副本,確保它始終可用,即使外部源發生故障。我已經轉移了您發佈的圖片,但只是要記住未來。 –

+0

我不知道爲什麼,但equalizehist給這種情況下更糟糕的結果..我也有時有這個問題.. –

回答

18

我在這裏討論了一些技巧:How can I adjust contrast in OpenCV in C?

請檢查一下。下面是我得到當我想你的形象

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

+1

+1我真的很喜歡你的答案,保持良好的工作。 – karlphillip

+1

謝謝!!!!! –

+0

@AbidRahmanK:你能和我分享你的代碼嗎? –

5

它被稱爲equalizeHist。我不知道它在emgu中的名字,但結果應該正是你所需要的 - 更明亮的背景和更深的文本。

編輯

只提取邊緣(這是從圖像增強技術完全不同),你可以簡單地套用坎尼。選擇兩個閾值20和60作爲開始,然後增加(或減少它們),保持它們之間的比率爲3:1,直到您有一個好看的邊緣圖像。

5

我建議使用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) 
-1

無論哪種方式,您還可以檢查每一個每一個像素。如果小於定義值,則將其設置爲0;如果超過定義值,則將其設置爲255。

相關問題