Cómo obtener efecto de color mágico como escáner de cámara utilizando OpenCV
Esta es la imagen original.
- Eclipse se compila con éxito, pero todavía da errores semánticos
- Android Studio con opencv para android ndk, archivos de cabecera opencv no encontrados
- En la transformación Circle Hough, ¿cuál es la razón inversa de la resolución del acumulador (dp) y cómo afecta la detección de círculos?
- Cómo cambiar el tamaño de una imagen a la imagen de alta resolución sin perder píxeles?
- Método eficaz para convertir un archivo de imagen de RGB a YUV
Cam Scanner Efecto de color mágico.
Mi filtro en la imagen.
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);
- Uso de la cámara LED Flash con OpenCV en Android
- Android - Detección de funciones de cara
- La aplicación se estrelló después de la señal fatal 11 (SIGSEGV) en 0x00000020 (código = 1) - Android
- OpenCV Android - No se puede resolver la función JNI correspondiente
- No se puede construir caffe en android
- No se puede vincular la biblioteca nativa en la muestra de Android de OpenCV
- Error: no se puede encontrar la variable de símbolo GL_TEXTURE_EXTERNAL_OES + OpenCV en Android Studio
- Detecta el movimiento de una persona e identifica sus partes del cuerpo moviéndose hacia la cámara en Android
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)
ret, thresh1 = cv2.threshold(img, 130, 255, cv2.THRESH_BINARY)
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)
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)
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
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.
- Desplazamiento de Android SurfaceView
- ¿Qué es más seguro: navegador externo o ChromeTab para autorización?