Detección de bordes de destino en el procesamiento de imágenes

Detección de bordes de destino en el procesamiento de imágenes

análisis de experimentos

Inserte la descripción de la imagen aquí

La parte digital de la imagen es detectada por el borde del operador de sobel y convertida en una imagen integral para encontrar el área objetivo.
Mi idea es realizar una binarización simple después de la detección de bordes para resaltar la parte digital, luego resaltar el área objetivo en el mapa integral, encontrar las coordenadas de la esquina superior izquierda del área digital y dibujar un rectángulo desde la parte superior izquierda hacia la inferior derecha.

Operador Sobel para detección de bordes

La detección de bordes del operador de Soble utiliza la función SobelGrayImage;
como encontré que hay puntos blancos más claros junto a los números, realizaré una binarización simple después:

	void bin(BYTE *pSrc, int width, int height, BYTE *pDst)
	{
    
    
		for(int i=0;i<height;i++)
			for (int j = 0; j < width; j++)
			{
    
    
				pDst[i*width + j] = (pSrc[i*width + j]> 200 ? pSrc[i*width + j] : 0);
			}
		return;
}

Luego calcula el mapa integral:

	void integrogram(BYTE* inputMatrix, int width, int height, BYTE* outputMatrix) 
	{
    
    
		BYTE *columnSum = new BYTE[width];
		for (int i = 0; i < width; i++) 
		{
    
    
			columnSum[i] = inputMatrix[i];
			outputMatrix[i] = inputMatrix[i];
			if (i > 0) 
			{
    
    
				outputMatrix[i] += outputMatrix[i - 1];
			}
		}
		for (int i = 1; i < height; i++) 
		{
    
    
			int offset = i * width;
			columnSum[0] += inputMatrix[offset];
			outputMatrix[offset] = columnSum[0];
			for (int j = 1; j < width; j++) 
			{
    
    
				columnSum[j] +=(255, inputMatrix[offset + j]);
				outputMatrix[offset + j] = min(255,outputMatrix[offset + j - 1] + columnSum[j]);
			//全部变成255;
			}
		}
	return;
}

En este momento, habrá un área objetivo obvia:

Inserte la descripción de la imagen aquí

Obtenga las coordenadas del primer píxel blanco en la esquina superior izquierda:

void findROIxy(BYTE *pSrc,int width,int height,int *x,int *y)
	{
    
    
		for (int i = 0; i < height; i++)
			for(int j=0;j<width;j++)
			{
    
    
				if (pSrc[i*width + j] != 0)
				{
    
    
					*x = j;
					*y = i;
					return;
				}
			}
}

Dibuja un rectángulo de arriba a la izquierda a abajo a la derecha;

void drawRectangle(BYTE *pSrc, int x, int y, int width,int height,int draw_width, 	int draw_height,BYTE *pDst)
	{
    
    
		for (int i = x - 10; i < x + draw_width; i++)
		{
    
    
			pSrc[y*width + i] = 255;
			pSrc[(y + draw_height)*width + i] = 255;
		}
		for (int i = y; i < y + draw_height; i++)
		{
    
    
			pSrc[i*width+x-10] = 255;
			pSrc[i*width + x + draw_width] = 255;
		}
		
}

resultado

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Se necesitan unos 10 ms para cada ejecución en el modo de depuración y unos 4 ms en el modo de liberación;

Este proceso no es muy estable, porque es solo una simple binarización. Si encuentra un punto que es similar al valor de píxel del área objetivo, entonces el marco rectangular se desviará mucho, y este enfoque tiene ciertas limitaciones, porque lo encontré absolutamente El tamaño del área digital de la mayoría de las imágenes es el mismo, por lo que decidí que el tamaño de esta área es fijo, por lo que no funcionará si lo pones en otras preguntas, necesitas modificar los parámetros, debería haber un enfoque más formal.

Supongo que te gusta

Origin blog.csdn.net/qq_36587495/article/details/108164957
Recomendado
Clasificación