2012-05-11 24 views
6

Sto solo provando a regolare il contrasto/luminosità in un'immagine in scala di grigi per evidenziare i bianchi in quell'immagine con Opencv in C. Come posso farlo? c'è qualche funzione che rende questo compito in opencv?Come posso regolare il contrasto in OpenCV in C?

immagine originale:

enter image description here

immagine modificata:

enter image description here

Grazie in anticipo!

+0

È possibile regolarli in opencv. Ma sarebbe più utile se potessi aggiungere un'immagine, quindi spiegare quello che vuoi. –

+0

@Abid Rahman K Immagini aggiunte .. – edsonlp1

+0

La seconda immagine che si desiderava come risultato? Se è così, come avete fatto? lo stesso può essere fatto in Opencv –

risposta

8

penso che si può regolare il contrasto qui in due modi:

1) Histogram Equalization :

ma quando ho provato questo con la vostra immagine, risultato non è stato come previsto. Vedi qui sotto:

enter image description here

2) Thresholding:

Qui, i confrontato ciascun valore di pixel di ingresso con un valore arbitrario (che ho preso 127). Di seguito è riportata la logica che ha una funzione integrata in opencv. But remember, output is Binary image, not grayscale as you did.

If (input pixel value >= 127): 
    ouput pixel value = 255 
else: 
    output pixel value = 0 

E sotto è il risultato che ho ottenuto:

enter image description here

Per questo, è possibile utilizzare Threshold function o compare function

3) Se si è obbligatorio ottenere l'immagine in scala di grigi come output, fare come segue:

(codice è in OpenCV-Python, ma per ogni funzione, corrispondenti funzioni C sono disponibili in opencv.itseez.com)

for each pixel in image: 
    if pixel value >= 127: add 'x' to pixel value. 
    else : subtract 'x' from pixel value. 

('x' è un valore arbitrario.) Così la differenza tra i pixel chiari e scuri aumenta.

img = cv2.imread('brain.jpg',0) 

bigmask = cv2.compare(img,np.uint8([127]),cv2.CMP_GE) 
smallmask = cv2.bitwise_not(bigmask) 

x = np.uint8([90]) 
big = cv2.add(img,x,mask = bigmask) 
small = cv2.subtract(img,x,mask = smallmask) 
res = cv2.add(big,small) 

E sotto è il risultato ottenuto:

enter image description here

+0

Grazie. Il Thresholding funziona per me perfetto! – edsonlp1

+8

Non di questi indirizzi la domanda, ad esempio come regolare il contrasto –

+1

è vero che il titolo della domanda è "come regolare il contrasto". Ma quello che vuole fare in questione è evidenziare la parte bianca nell'immagine. Quindi ho risposto per quello con qualsiasi conoscenza che ho. E naturalmente, in un commento, OP ha detto che un metodo funziona perfettamente per lui. Quindi penso che abbia risolto il problema. Prendendo in considerazione solo il titolo, potresti avere ragione. :) –

0

È necessario lavorare con l'istogramma, probabilmente solo per l'equalizzazione. Ecco un buon tutorial per questo, ed ecco lo C API description.

2

Il documento ufficiale OpenCV su questo argomento, Brightness and contrast adjustments, codice di azioni e una spiegazione dettagliata su come realizzare il compito.

+5

In realtà non è così. Fornisce un cattivo esempio e collega la spiegazione a un libro che è possibile acquistare. –

+1

Questa documentazione è assolutamente inutile. – grill

+1

porta a un host sconosciuto –

8

È anche possibile controllare l'algoritmo di OpenCV CLAHE. Invece di equalizzare globalmente l'istogramma, divide l'immagine in tessere e le equalizza localmente, quindi le unisce insieme. Questo può dare un risultato molto migliore.

Con l'immagine in OpenCV 3.0.0:

import cv2 
inp = cv2.imread('inp.jpg',0) 
clahe = cv2.createCLAHE(clipLimit=4.0, tileGridSize=(8,8)) 
res = clahe.apply(inp) 
cv2.imwrite('res.jpg', res) 

dà qualcosa abbastanza piacevole

After CLAHE

Per saperne di più su di esso qui, anche se non è super disponibile: http://docs.opencv.org/3.1.0/d5/daf/tutorial_py_histogram_equalization.html#gsc.tab=0

Problemi correlati