c# - nivel - intensidad imagenes
¿Cómo puedo ecualizar el contraste y el brillo de las imágenes usando opencv? (4)
Tengo una imagen que he escaneado, pero el libro blanco no es blanco en la pantalla. ¿Hay alguna manera de igualar el contrato / brillo para hacer que el fondo sea más blanco?
Actualizar
Probé la función Image._EqualizeHist sugerida 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 obtenga un resultado aún peor (también cuando se escala el primer gris):
¿Me faltan otros parámetros?
Sugiero usar 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
.
Aquí es cómo hacerlo en python (debe ser muy fácil convertirlo en 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)
De cualquier manera, también puede verificar 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.
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 solo los bordes (que es muy diferente de las técnicas de mejora de la imagen) simplemente puede aplicar 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.
Aquí he discutido algunas técnicas: ¿cómo puedo ajustar el contraste en OpenCV en C?
Compruébelo por favor. A continuación se muestran los resultados que obtuve cuando probé los dos últimos métodos en su imagen
1) Umbralización :
Thresholding da una imagen binaria. Si eso es lo que quieres, puedes aplicar la threshold function
2) Si se necesita una imagen en escala de grises :
Adicional:
Morphological closing
también funciona 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 la API de Python)
Resultado a continuación: