OpenCV aprendizaje de operaciones básicas de imagen (7): extracción de líneas horizontales y horizontales, código de verificación al fondo

PD: Este artículo utiliza dos pequeños casos para demostrar la aplicación de operaciones morfológicas en el procesamiento de imágenes.

Extraer líneas rectas y horizontales en una imagen

Introducción a AIP

Segmentación de umbral adaptativo

void adaptiveThreshold(InputArray src, OutputArray dst,  
                        double maxValue, int adaptiveMethod,  
                       int thresholdType, int bolckSize, double C)  

Parámetro 1: InputArray tipo src, imagen de entrada, relleno de canal único, tipo de punto flotante único de 8 bits Mat.
Parámetro 2: Aquí se almacena el resultado de la operación de la función. Es la imagen de salida (del mismo tamaño y tipo que la imagen de entrada).
Parámetro 3: preestablece el valor máximo que satisface la condición, y la imagen normal es 255.
Parámetro 4: especifique el algoritmo de umbral adaptativo. Puede elegir ADAPTIVE_THRESH_MEAN_C o ADAPTIVE_THRESH_GAUSSIAN_C.
Parámetro 5: especifique el tipo de umbral. Puede elegir THRESH_BINARY o THRESH_BINARY_INV. (Es decir, umbral binario o umbral binario inverso).
Parámetro 6: Indica el tamaño del bloque vecino, utilizado para calcular el umbral de área, y se selecciona un número impar.
Parámetro 7: El parámetro C representa un parámetro relacionado con el algoritmo, es una constante extraída de la media o media ponderada y puede ser un número negativo.

 

ADAPTIVE_THRESH_MEAN_C es el valor promedio del bloque de vecindad local. El algoritmo primero encuentra el valor promedio en el bloque y luego resta la constante C.

ADAPTIVE_THRESH_GAUSSIAN_C es la suma ponderada de Gauss de bloques de vecindarios locales. El algoritmo consiste en ponderar los píxeles alrededor (x, y) en el área de acuerdo con la función gaussiana de acuerdo con su distancia desde el punto central, y luego restar la constante C.

Proceso e ideas

  • Primero convierta la imagen a escala de grises

  • Utilice la segmentación de umbral adaptativo para procesar la imagen en dos imágenes (nota: cuando el primer plano es más oscuro que el fondo, use la operación cerrada para el procesamiento de primer plano; cuando el primer plano sea más brillante que el fondo, use la operación abierta para el procesamiento de primer plano);

  • El núcleo de cálculo de diseño se utiliza para extraer las líneas conectadas horizontales y verticales:
    • Si extrae líneas horizontales y horizontales, la forma del núcleo debe ser Tamaño (5,1); si extrae líneas verticales, la forma del núcleo debe ser Tamaño (1,5). En resumen, en la dirección a extraer, el núcleo debe ser más grande que en la otra dirección.
    • En la dirección de extracción, cuanto mayor es el tramo del núcleo, mayor es el grado de extracción, es decir, mayor es el grado de conectividad en esta dirección que se requiere extraer.
    • En la dirección de no extracción, configúrelo en "1" para asegurarse de que la conectividad en la otra dirección esté bloqueada por interferencias en la dirección de extracción.

Código y práctica

#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
	//src = imread("src.jpg");
	Mat src = imread("1.PNG");
	if (!src.data)
	{
		cout << "cannot open image" << endl;
		return -1;
	}
	namedWindow("input image", WINDOW_AUTOSIZE);
	imshow("input image",src);
	
	Mat gray;
	cvtColor(src,gray ,COLOR_BGR2GRAY);
	imshow("gray", gray);
	adaptiveThreshold(gray, gray, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 10);
	imshow("bineray", gray);
	
	Mat Hline = getStructuringElement(MORPH_RECT, Size(1, 5), Point(-1, -1));
	Mat Vline = getStructuringElement(MORPH_RECT, Size(5, 1), Point(-1, -1));
	Mat H_res, V_res;

	morphologyEx(gray,H_res,MORPH_CLOSE,Hline);
	morphologyEx(gray,V_res,MORPH_CLOSE,Vline);

	imshow("H-res", H_res);
	imshow("V-res", V_res);

	waitKey(0);
	return 0;
}

Elimina la interferencia de fondo en la imagen captcha

Proceso e ideas (consulte el ejemplo anterior)

  • Primero convierta la imagen a escala de grises
  • Utilice la segmentación de umbral adaptativo para procesar la imagen en dos imágenes (nota: cuando el primer plano es más oscuro que el fondo, use la operación cerrada para el procesamiento de primer plano; cuando el primer plano sea más brillante que el fondo, use la operación abierta para el procesamiento de primer plano);
  • Ajuste el tamaño del núcleo informático de acuerdo con el tamaño del ruido, de modo que pueda filtrar la interferencia de fondo, pero preservar la conectividad de los personajes. Generalmente, la relación de aspecto del tamaño del núcleo es la misma que la relación de aspecto de la imagen del código de verificación. De lo contrario, debe ajustarse de acuerdo con la situación real para garantizar que el núcleo informático sea lo más grande posible mientras se mantiene la conectividad de los caracteres, y cuanto mayor sea el ruido, más fuerte será el filtrado.

Código y práctica

#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
	
	Mat src = imread("chars.png");
	if (!src.data)
	{
		cout << "cannot open image" << endl;
		return -1;
	}
	namedWindow("input image", WINDOW_AUTOSIZE);
	imshow("input image",src);
	
	Mat gray;
	cvtColor(src,gray ,COLOR_BGR2GRAY);
	imshow("gray", gray);
	adaptiveThreshold(gray, gray, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 10);
	imshow("bineray", gray);
	
	Mat Kernel = getStructuringElement(MORPH_RECT, Size(3, 5), Point(-1, -1));
        //改变核在总想和横向的范围,来保证字符的连通性
	Mat Result;
	morphologyEx(gray,Result,MORPH_CLOSE,Kernel);

	imshow("Result", Result);

	waitKey(0);
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/fan1102958151/article/details/107092562
Recomendado
Clasificación