최소 / 최대 에지 검출

                                       최소 / 최대 에지 검출

최소 / 최대 에지 검출 알고리즘의 주요 아이디어 :

  1. 이미지 잡음 제거. 본원에 사용 된 바와 같이, 알고리즘은 이미지 잡음 제거를위한 메디안 필터링 알고리즘은
  2. 이웃의 최대 및 최소를 계산합니다. 잡음 제거 후, 주변의 최대 값과 최소값을 계산
  3. 중심 화소의 최대 값과 최소값의 차이는 현재의 템플릿에 할당

주요 코드로 중간 필터 알고리즘 :

#include"Sharp.h"
int Sort(T_U8 *bArray,int size)
{
	int		i;
	int		j,k;	
	int  bTemp;

	// 用冒泡法对数组进行排序
	for (j = 0; j < size; j ++)
	{
		for (i = 0; i < size- j; i ++)
		{
			if (bArray[i] > bArray[i + 1])
			{
				// 互换
				bTemp = bArray[i];
				bArray[i] = bArray[i + 1];
				bArray[i + 1] = bTemp;
			}
		}
	}
}


T_U8 MedianFilter(T_U8 *src_img,DWORD width,DWORD height,T_U8 filterSize)
{
	int i,j,m,n,k,medianIndex,neighbourCount,filteroffset,index,neighbour,medianFilterPos;
	T_U8 *medianFilterResult,*Neighbours,*dst;
	T_U32 Gray_line_byte =  (width*8/8+3)/4*4;

	neighbourCount = filterSize*filterSize;
	medianIndex = neighbourCount/2;
	filteroffset = (filterSize-1)/2;

	Neighbours = (T_U8*)malloc(neighbourCount);
	if(Neighbours == NULL)
	{
		printf("can't malloc\r\n" );
		return 0;
	}
	memset(Neighbours,0,neighbourCount);
	dst = src_img + 54 + 256*sizeof(RGBQUAD);

	for(i = filteroffset;i < height-filteroffset;i++)
	{
		for(j = filteroffset;j < width-filteroffset;j++)
		{
			index = i*Gray_line_byte+j;
			for(m = -filteroffset,neighbour = 0;m <= filteroffset;m++)
			{
				for(n = -filteroffset;n <= filteroffset;n++,neighbour++)
				{
					medianFilterPos = index+m*Gray_line_byte+n;
					Neighbours[neighbour] = dst[medianFilterPos];
				}
			}

			Sort(Neighbours,neighbourCount);
			
			dst[index] = Neighbours[medianIndex];
		}
	}

	return 0;
}

 최대 및 최소 에지 검출 알고리즘 코드는 다음입니다 :

#include"Sharp.h"

T_U8* MinMaxEdgeDetection(T_U8 *src_img,DWORD width,DWORD height,T_U8 filterSize)
{
	int i,j,m,n,k,medianIndex,neighbourCount,filteroffset,index,neighbour,medianFilterPos,MinPix = 0,MaxPix = 0;
	T_U8 *MinMaxEdgeDecter,*Neighbours,*dst;
	T_U32 Gray_line_byte =  (width*8/8+3)/4*4;

	neighbourCount = filterSize*filterSize;
	medianIndex = neighbourCount/2;
	filteroffset = (filterSize-1)/2;
	MinMaxEdgeDecter = (T_U8*)malloc(height*Gray_line_byte);
	Neighbours = (T_U8*)malloc(neighbourCount);
	if(Neighbours == NULL)
	{
		printf("can't malloc\r\n" );
		return 0;
	}
	memset(Neighbours,0,neighbourCount);
	memset(MinMaxEdgeDecter,0,height*Gray_line_byte);
	dst = src_img + 54 + 256*sizeof(RGBQUAD);

	for(i = filteroffset;i < height-filteroffset;i++)
	{
		for(j = filteroffset;j < width-filteroffset;j++)
		{
			index = i*Gray_line_byte+j;
			MinPix = 99999;
			MaxPix = -99999;
			for(m = -filteroffset,neighbour = 0;m <= filteroffset;m++)
			{
				for(n = -filteroffset;n <= filteroffset;n++,neighbour++)
				{
					medianFilterPos = index+m*Gray_line_byte+n;
					Neighbours[neighbour] = dst[medianFilterPos];
				}
			}

			Sort(Neighbours,neighbourCount);
			MinPix = Neighbours[0];
			MaxPix = Neighbours[neighbourCount-1];
			
			MinMaxEdgeDecter[index] = CLIP255((int)((MaxPix-MinPix)));
		}
	}

	return MinMaxEdgeDecter;
}

최대 및 최소 에지 검출 결과는 다음과 같습니다

 

게시 49 개 원래 기사 · 원 찬양 (138) ·은 30 만 + 조회수

추천

출처blog.csdn.net/lz0499/article/details/103300597