最小/最大エッジ検出

                                       最小/最大エッジ検出

最小/最大エッジ検出アルゴリズムの主なアイデア:

  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