Cómo obtener efecto de color mágico como escáner de cámara utilizando OpenCV

Esta es la imagen original.

Imagen Orignal

Cam Scanner Efecto de color mágico. Efecto del escáner de leva

Mi filtro en la imagen.

Mi filtro

Estoy cambiando el contraste de la imagen.

dst.convertTo(dst, -1, 2, 0); 

A continuación, utilizar el desenfoque gaussiano para suavizar.

 cv::GaussianBlur(dst,result,cv::Size(0,0),3); cv::addWeighted(dst, 1.5, result, -0.5, 0, result); 

¿Qué debo hacer para lograr ese tipo de efecto en mi imagen?

ACTUALIZAR

Después de Histograma Equilización –

 vector<Mat> channels; Mat img_hist_equalized; cvtColor(dst, img_hist_equalized, CV_BGR2YCrCb); split(img_hist_equalized,channels); equalizeHist(channels[0], channels[0]); merge(channels,img_hist_equalized); cvtColor(img_hist_equalized, img_hist_equalized, CV_YCrCb2BGR); 

Histograma Equilización

La aplicación de camscanner puede estar utilizando algún algoritmo complejo para manejar varios casos de relámpagos, etc. Pero intentaré cubrir un enfoque básico a tal problema, La idea básica aquí es Binarización de la imagen de entrada dada, o más exactamente podemos decir Theresholding a Dada la imagen, si usted mira la documentación de OpenCV, hay un montón de referencias a umbral de una determinada imagen, así que vamos a empezar con la documentación .

  • En el contexto de las hojas impresas, suponemos que el color de la tinta es siempre negro y el color del papel es uniforme y la intensidad es mayor que la intensidad de Tinta de color, por lo que asumimos con seguridad un umbral (digamos 40), (máximo es 255) y el umbral de la imagen de entrada como:

     ret, thresh1 = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY) 

    Introduzca aquí la descripción de la imagen

     ret, thresh1 = cv2.threshold(img, 130, 255, cv2.THRESH_BINARY) 

    Introduzca aquí la descripción de la imagen

    Hay muchas desventajas de este método, en primer lugar no es independiente de la varianza de intensidad, por lo que hay una probabilidad muy menor de que usted puede estimar con precisión un valor umbral que los segmentos de texto de la imagen dada, tiene aplicaciones muy limitadas, puede ser Sólo se aplica en caso de que el papel de fondo es exactamente blanco con una variación mínima de intensidad, por lo que este proceso no se puede utilizar para imágenes del mundo real .

  • Umbral adaptativo : Este método cubre el problema de la variación de intensidad en la imagen dada, aquí el umbral se hace sobre los valores de los píxeles vecinos, así que las transiciones de intensidad más baja a más alta y viceversa se capturan con éxito con este método como:

     thresh = cv2.adaptiveThreshold(original_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) 

    Introduzca aquí la descripción de la imagen

    Trabajo adicional : Usted puede trabajar en varias técnicas de eliminación de la imagen binaria, para quitar los puntos, o tener una mirada en quitar el ruido de la sal y de la pimienta de la imagen.

  • Binación de Otu : Este es otro enfoque agradable que calcula inteligentemente el valor de umbral, entre las máximas, Puede funcionar muy bien en algunos de los casos, pero parece fallar en su caso.

     ret2,thresh = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) 

    Introduzca aquí la descripción de la imagen

Básicamente hace el mismo thresholding global. Pero ahora el umbral se calcula automáticamente de tal manera que el umbral esté entre 2 picos y por lo tanto segmentar la tinta del papel.

Método recomendado: Supongo que el mejor enfoque para comenzar es el umbral adaptativo , puede probar algunas otras técnicas de preprocesamiento, como la imagen de nitidez , ecualización de histograma , etc y analizar cómo se crea una salida más realista, también puede tratar de hacer algún post Procesamiento como la eliminación de la imagen , Operaciones morfológicas

He intentado el denoising de la imagen y lo encontró más eficaz a otros enfoques,

 denoised = cv2.fastNlMeansDenoising(thresh, 11, 31, 9) # you may experiment with the constants here 

Introduzca aquí la descripción de la imagen

Pero le doy la bienvenida a probar varias combinaciones de los enfoques anteriores para ver cuál funciona para todos los casos.

He escrito código que hace este tipo de cosas, aunque no con OpenCV.

Normalmente, yo analizaría un histograma, calcularía lo que "blanco" y "negro" se basa en el histograma, y ​​luego escala los valores de imagen para que el negro se escala por debajo de 0 y el blanco se escala por encima de 1 (o 255 dependiendo de su representación) , Fijando finalmente los valores de color.

Sin embargo, con OpenCV puede haber una forma más sencilla. Trate de utilizar la ecualización del histograma en su página recortada antes de aplicar un filtro de contraste, que debería extender los valores de píxeles de una manera más consistente para que el ajuste del contraste funcione de manera más fiable en más situaciones. Puede intentar usar ecualización de histograma localizada para ayudar a mitigar degradados en la imagen recortada debido a la iluminación, pero esto puede causar problemas con áreas en blanco de la página.

Me doy cuenta de que estoy un poco tarde para el juego, pero he encontrado esta solución sencilla y asombrosa:

 src.convertTo(dst, -1, 1.9, -80); 

Src y dst pueden ser la misma imagen si está trabajando en una tubería de procesamiento.

  • OpenCV warpPerspective rendimiento lento
  • Problema al usar OpenCV2.3.1 con la actividad de Android Native
  • Android OpenCV getPerspectiveTransform y warpPerspective
  • Error OpenCV: No se puede cargar la biblioteca de información para OpenCV
  • Error: Programa "/ NDK-build" no se encuentra en PATH
  • Gradle NDK para especificar una directiva 'include' en Android.mk generado
  • Cargando una imagen usando OpenCV en Android
  • Opencv C + + crear objeto Mat de android NV21 buffer de datos de imagen
  • Error al establecer ROI OpenCV Android
  • ¿Cómo guardar las características de Keypoint de OpenCV en la base de datos?
  • Reconocimiento de monedas en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.