2012-05-11 42 views
6

Estoy tratando de ajustar el contraste/brillo en una imagen en escala de grises para resaltar los blancos en esa imagen con Opencv en C. ¿Cómo puedo hacer eso? ¿Hay alguna función que haga esta tarea en opencv?¿Cómo puedo ajustar el contraste en OpenCV en C?

imagen original:

enter image description here

imagen Modificado:

enter image description here

Gracias de antemano!

+0

Es posible ajustarlos en opencv. Pero sería más útil si pudieras agregar una imagen y luego explicar lo que quieres. –

+0

@Abid Rahman K Imágenes añadidas .. – edsonlp1

+0

¿Es la segunda imagen que desea como resultado? Si es así, ¿cómo lo hiciste? lo mismo se puede hacer en Opencv –

Respuesta

8

Creo que se puede ajustar el contraste aquí de dos maneras:

1) Histogram Equalization :

Pero cuando he intentado esto con su imagen, resultado no fue como se esperaba. Verificar a continuación:

enter image description here

2) Umbral:

Aquí, comparé cada valor de píxel de entrada con un valor arbitrario (que i tomó 127). A continuación se muestra la lógica que tiene la función incorporada en 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 

Y a continuación es el resultado que obtuve:

enter image description here

Para ello, puede utilizar Threshold function o compare function

3) Si usted es obligatorio obtener una imagen en escala de grises como salida, haga lo siguiente:

(es el código de OpenCV-Python, pero para cada función, correspondientes funciones de C están disponibles en opencv.itseez.com)

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

('x' es un valor arbitrario). Así la diferencia entre los píxeles claros y oscuros 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) 

Y a continuación es el resultado obtenido:

enter image description here

+0

Gracias. ¡El umbral funciona para mí perfecto! – edsonlp1

+8

Ninguno de estos abordan la pregunta, es decir, cómo ajustar el contraste –

+1

, es cierto que el título de la pregunta es 'cómo ajustar el contraste'. Pero lo que él quiere hacer en cuestión es resaltar la parte blanca en la imagen. Así que respondí por eso con cualquier conocimiento que tenga. Y, por supuesto, en el comentario, OP dijo que un método funciona perfecto para él. Así que creo que se abordó el problema. Tomando solo el título en consideración, es posible que tengas razón. :) –

0

Necesita trabajar con el histograma, probablemente solo ecualizando. Aquí hay un buen tutorial para eso, y aquí está el C API description.

2

El documento oficial OpenCV sobre este tema, Brightness and contrast adjustments, código de acciones y una explicación detallada sobre cómo realizar la tarea.

+5

En realidad, no es así. Proporciona un mal ejemplo y vincula la explicación a un libro que puedes comprar. –

+1

Esta documentación es absolutamente inútil. – grill

+1

conduce a un host desconocido –

8

También puede consultar el algoritmo OpenCV CLAHE. En lugar de ecualizar el histograma globalmente, divide la imagen en mosaicos y los ecualiza localmente, luego los une. Esto puede dar un resultado mucho mejor.

Con su imagen en 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) 

da algo bastante agradable

After CLAHE

Lea más sobre esto aquí, aunque no es muy útil: http://docs.opencv.org/3.1.0/d5/daf/tutorial_py_histogram_equalization.html#gsc.tab=0

Cuestiones relacionadas