2012-05-12 51 views
10

Tengo una imagen que he escaneado, pero el papel blanco no es blanco en la pantalla. ¿Hay alguna manera de igualar el contrato/brillo para hacer que el fondo sea más blanco?¿Cómo puedo ecualizar el contraste y el brillo de las imágenes usando opencv?

actualización

He probado la función Image._EqualizeHist sugerido de EmguCv:

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

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

Pero obtener un resultado aún peor (también cuando la primera escala de grises):

¿Me faltan otros parámetros?

+1

Stack Overflow proporciona un servicio gratuito de alojamiento de imágenes, simplemente haga clic en el botón de imagen en la barra de herramientas y apúntelo a su imagen alojada localmente en su computadora en otra parte de la web. Esto realmente carga y refleja una copia de la imagen, lo que garantiza que siempre estará disponible, incluso si la fuente externa se cae. Ya he desplazado las imágenes que ha publicado, pero solo hay que tenerlas en cuenta para el futuro. –

+0

No sé por qué, pero equalisthist da un resultado peor en tales casos .. yo también tengo este problema a veces .. –

Respuesta

18

yo hemos discutido algunas de las técnicas aquí: How can I adjust contrast in OpenCV in C?

comprobamos por favor. A continuación se presentan los resultados que obtuve cuando he intentado dos últimos métodos en su imagen

1) Umbral:

Umbral da una imagen binaria. Si eso es lo que se desea se puede aplicar threshold function

2) Si la imagen en escala de grises necesario:

enter image description here

adicional:

Morphological closing también trabajan bien en su 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)) 

(código en Python API)

resultado a continuación:

enter image description here

+1

+1 Me encantan sus respuestas, sigan con el buen trabajo. – karlphillip

+1

gracias !!!!! –

+0

@AbidRahmanK: ¿puedes compartir tu código conmigo? –

5

Se llama equalizeHist. No sé su nombre en emgu, pero el resultado debería ser exactamente lo que necesita: fondo más brillante y texto más oscuro.

EDITAR

para extraer sólo los bordes (lo cual es muy diferente de las técnicas de mejora de la imagen) se puede aplicar simplemente Canny. Seleccione los dos umbrales como 20 y 60, para comenzar, y luego aumente (o disminuya) manteniendo una relación de 3: 1 entre ellos, hasta que tenga una imagen de borde atractiva.

5

sugiere emplear AdaptiveThreshold. Funciona haciendo los umbrales del vecindario local para cada píxel de la imagen (esto realmente es un gran problema cuando hay fondos degradados, un poco más fuertes que en su imagen). El parámetro blockSize es el tamaño del vecindario, y el valor de los píxeles procesados ​​debe ser mayor que el valor promedio del vecindario menos param1.

enter image description here

Aquí es cómo hacerlo en Python (que debe ser muy fácil de convertir a 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

De cualquier manera, también se puede comprobar cada cada píxel. Establézcalo en 0 si es menor que un valor definido y configurado en 255 si supera el valor de definición.

Cuestiones relacionadas