Aumenta el brillo de la imagen sin desbordamiento

Tengo un problema al intentar boost el brillo de la imagen.

Aquí está la imagen de origen:

introduzca la descripción de la imagen aquí

La imagen que quería obtener es así:

introduzca la descripción de la imagen aquí

Ahora para boost el brillo con el siguiente código:

image = cv2.imread("/home/wni/vbshare/tmp/a4_index2.png",0) if sum(image[0])/len(image[0])<200: new = np.where((255-image)<image,255,image*2) else: new = image return new 

Y, tengo la siguiente imagen:

introduzca la descripción de la imagen aquí

Entonces, parece que el brillo de algunos puntos se desbordó.

Y traté de cambiar el umbral de 200 a algún otro número, por ejemplo, 125, 100, 140.etc Sin embargo, el brillo de la imagen permanece casi igual de oscuro o desbordado.

Env:

Python: 2.7.10

Opencv: 3.2.0

Cualquier sugerencia para esto es apreciada.

Gracias.

Aquí está mi oportunidad en un algoritmo simple para limpiar esa imagen en particular. Siéntase libre de jugar con él y ajústelo para obtener el resultado deseado.

NB : El código que se muestra debe funcionar con las twigs 2.4.xy 3.x de OpenCV.

Paso 0

Cargue la imagen de entrada como escala de grises.

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

Paso 1

Dilata la imagen, para deshacerte del texto. Este paso de alguna manera ayuda a preservar el código de barras.

 dilated_img = cv2.dilate(img, np.ones((7,7), np.uint8)) 

Dilatada

Paso 2

La mediana difumina el resultado con un kernel de tamaño decente para suprimir aún más cualquier texto.

Esto debería proporcionarnos una imagen de fondo bastante buena que contenga todas las sombras y / o decoloración.

 bg_img = cv2.medianBlur(dilated_img, 21) 

Borroso

Paso 3

Calcule la diferencia entre el original y el fondo que acabamos de obtener. Los bits que son idénticos serán negros (cerca de la diferencia 0), el texto será blanco (gran diferencia).

Como queremos negro sobre blanco, invertimos el resultado.

 diff_img = 255 - cv2.absdiff(img, bg_img) 

Diferencia invertida

Etapa 4

Normaliza la imagen, para que utilicemos el rango dynamic completo.

 norm_img = diff_img.copy() # Needed for 3.x compatibility cv2.normalize(diff_img, norm_img, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC1) 

Normalizado

Paso 5

En este punto todavía tenemos el papel algo gris. Podemos truncarlo y volver a normalizar la imagen.

 _, thr_img = cv2.threshold(norm_img, 230, 0, cv2.THRESH_TRUNC) cv2.normalize(thr_img, thr_img, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC1) 

Gris recortado

Hecho…

Bueno, al menos para mí;) Probablemente querrá recortarlo y hacer lo que desee después del procesamiento.


Nota: Podría valer la pena cambiar a una precisión mayor (16+ bit int o flotante) después de obtener la imagen de diferencia, para minimizar la acumulación de errores de redondeo en las normalizaciones repetidas.

Lo que necesitas es un umbral . Esto te permitirá configurar todo lo que no sea muy oscuro a blanco puro, y establecer el material muy oscuro en negro (o cualquier otro color). Esto debería hacerte comenzar:

 cutoff_val = 100 # everything above this is set to set_color set_color = 255 ret,thresh_img = cv2.threshold(image,cutoff_val,set_color,cv2.THRESH_BINARY) 

Después de que juegues con eso, puedes obtener mejores resultados utilizando un umbral adaptable .

Vea este gran tutorial haciendo básicamente lo que quiere — y extra, ¡también incluye un tutorial sobre deformación para obtener una región rectangular para el papel!

Edición: Obtuve resultados bastante buenos con su imagen combinando el umbral y luego el umbral adaptable.

 cutoff_val = 150 # everything above this is set to the cutoff val set_color = 255 # if ret,thresh_img = cv2.threshold(image,cutoff_val,set_color,cv2.THRESH_TRUNC) window_sz = 3 thresh_img2 = cv2.adaptiveThreshold(thresh_img,set_color,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,window_sz,2)