2012-05-12 15 views
10

Ich habe ein Bild, das ich gescannt habe, aber das weiße Papier ist nicht weiß auf dem Bildschirm. Gibt es eine Möglichkeit, den Vertrag/die Helligkeit auszugleichen, um den Hintergrund weißer zu machen?Wie vergleiche ich den Kontrast und die Helligkeit von Bildern mit opencv?

aktualisieren

ich die vorgeschlagene Image._EqualizeHist Funktion von EmguCv versucht haben:

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

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

Aber bekommen ein noch schlechteres Ergebnis (auch wenn erste graue skaliert):

Fehle ich andere Parameter?

+1

Stack Overflow bietet einen kostenlosen Bildhosting-Dienst, klicken Sie einfach auf die Bildschaltfläche in der Symbolleiste und zeigen Sie sie auf Ihr Bild, das lokal auf Ihrem Computer an anderer Stelle im Internet gehostet wird. Dadurch wird eine Kopie des Bildes hochgeladen und gespiegelt, wodurch sichergestellt wird, dass es immer verfügbar ist, auch wenn die externe Quelle ausfällt. Ich habe bereits die Bilder, die Sie gepostet haben, verschoben, aber nur etwas, was Sie für die Zukunft im Auge behalten sollten. –

+0

Ich weiß nicht warum, aber equalizizhist gibt schlechtere Ergebnisse in solchen Fällen .. Ich habe auch dieses Problem manchmal .. –

Antwort

18

Ich habe einige Techniken, die hier diskutiert: How can I adjust contrast in OpenCV in C?

Bitte überprüfen. Im Folgenden sind die Ergebnisse bekam ich, wenn ich auf dem Bild den letzten zwei Methoden versucht

1) Thresholding:

Thresholding ein binäres Bild gibt. Wenn das ist, was Sie wollen, können Sie threshold function

2) gelten, wenn Graustufenbild benötigt:

enter image description here

Zusätzlich:

Morphological closing auch in Ihrem Fall gut arbeiten

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)) 

(Code in Python API)

Ergebnis Unten:

enter image description here

+1

+1 Ich mag deine Antworten wirklich, mach weiter so. – karlphillip

+1

danke !!!!! –

+0

@AbidRahmanK: können Sie bitte Ihren Code mit mir teilen? –

5

Es heißt EqualizeHist. Ich kenne seinen Namen nicht in Emgu, aber das Ergebnis sollte genau das sein, was Sie brauchen - hellerer Hintergrund und dunklerer Text.

EDIT

nur die Kanten zu extrahieren (die aus den Bildverbesserungstechniken sehr unterschiedlich ist) Sie einfach Canny anwenden können. Wählen Sie die beiden Schwellenwerte als 20 und 60 für Start aus, und erhöhen Sie dann (oder verringern Sie sie), wobei Sie ein Verhältnis von 3: 1 zwischen ihnen beibehalten, bis Sie ein gut aussehendes Kantenbild haben.

5

I AdaptiveThreshold Verwendung empfehlen. Es funktioniert, indem man lokale Nachbarschaftsschwelle für jedes Pixel im Bild vornimmt (das ist wirklich eine große Sache, wenn es Gradientenhintergründe gibt, ein bisschen stärker als in deinem Bild). Der blockSize Parameter ist die Größe der Umgebung und der verarbeitete Pixelwert muss größer als der durchschnittliche Nachbarschaftswert minus param1 sein.

enter image description here

Hier ist, wie es in Python tun (es sollte sehr leicht zu c konvertieren):

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

In beiden Fällen können Sie auch jede jedes Pixel überprüfen. Setzen Sie es auf 0, wenn kleiner als ein definierter Wert, und auf 255, wenn der definierte Wert überschritten wird.