최소 / 최대 에지 검출
최소 / 최대 에지 검출 알고리즘의 주요 아이디어 :
- 이미지 잡음 제거. 본원에 사용 된 바와 같이, 알고리즘은 이미지 잡음 제거를위한 메디안 필터링 알고리즘은
- 이웃의 최대 및 최소를 계산합니다. 잡음 제거 후, 주변의 최대 값과 최소값을 계산
- 중심 화소의 최대 값과 최소값의 차이는 현재의 템플릿에 할당
주요 코드로 중간 필터 알고리즘 :
#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;
}
최대 및 최소 에지 검출 결과는 다음과 같습니다