2012-05-12 10 views
10

Ho un'immagine che ho scansionato, ma il foglio bianco non è bianco sullo schermo. C'è un modo per pareggiare il contratto/la luminosità per rendere lo sfondo più bianco?Come si equalizzano contrasto e luminosità delle immagini usando opencv?

Aggiornamento

Ho provato la funzione Image._EqualizeHist suggerito da EmguCv:

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

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

Ma ottenere un risultato ancora peggiore (anche se prima grigio scalato):

Mi mancano altri parametri?

+1

Stack Overflow fornisce un servizio di hosting di immagini gratuito, è sufficiente fare clic sul pulsante immagine nella barra degli strumenti e puntarlo verso l'immagine ospitata localmente sul computer in un altro punto sul web. Questo in realtà carica e rispecchia una copia dell'immagine, che assicura che sarà sempre disponibile, anche se la fonte esterna si interrompe. Ho già spostato le immagini che hai postato, ma solo qualcosa da tenere a mente per il futuro. –

+0

Non so perché, ma equalizehist dà risultati peggiori in questi casi .. anche io ho questo problema a volte .. –

risposta

18

ho discusso alcune tecniche qui: How can I adjust contrast in OpenCV in C?

prego lo controlla. Di seguito sono riportati i risultati che ho ottenuto quando ho provato ultimi due metodi sull'immagine

1) Thresholding:

Thresholding dà un'immagine binaria. Se questo è ciò che si desidera è possibile applicare threshold function

2) Se l'immagine in scala di grigi necessaria:

enter image description here

aggiuntive:

Morphological closing funzionano anche bene nel tuo caso

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

(codice in Python API)

risultato qui sotto:

enter image description here

+1

+1 Mi piacciono molto le vostre risposte, continuate così. – karlphillip

+1

grazie !!!!! –

+0

@AbidRahmanK: puoi condividere il tuo codice con me? –

5

Si chiama equalizeHist. Non conosco il suo nome in emgu, ma il risultato dovrebbe essere esattamente ciò di cui hai bisogno: uno sfondo più luminoso e un testo più scuro.

EDIT

Per estrarre solo i bordi (che è molto diversa dalle tecniche di miglioramento dell'immagine) si può semplicemente applicare Canny. Seleziona le due soglie come 20 e 60, per inizio, e poi aumenta (o diminuiscile) mantenendo una razione di 3: 1 tra di esse, finché non hai un'immagine di bordo di bell'aspetto.

5

Io suggerisco di usare AdaptiveThreshold. Funziona eseguendo il thresholding locale per ogni pixel dell'immagine (questo è davvero un grosso problema quando ci sono sfondi sfumati, un po 'più forti di quelli dell'immagine). Il parametro blockSize è la dimensione del vicinato e il valore dei pixel elaborati deve essere maggiore del valore medio della vicinanza meno param1.

enter image description here

Ecco come farlo in python (dovrebbe essere molto facile da convertire in 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

In entrambi i casi, è anche possibile controllare ogni ogni pixel. Impostarlo su 0 se inferiore a un valore definito e impostare su 255 se supera il valore di definizione.

Problemi correlati