영상 인식처리의 소벨이라는 알고리즘입니다.
소벨이라는 것은 이미지의 윤곽부분만을 추출하는 것입니다.
명도가 짙은곳과 낮은 곳을 추출하여 그 부분만을 reDraw
하는 것이지요.. 그런데 도저히 델파이로 구현하기가
힘들더군요...
꼭 구현을 해야 하는데
이미지 프로세싱에 자신있는 분 ..좀 도와주세요..
아래의 것은 비쥬얼 c++ 로 작성한 부분의 핵심부분인데
정말 잘되여...
그 아래는 제가 작성하다만 델파이 소스입니다
꼭 아시는분 도와주세요..
델파이로 구현이 가능한지... 흐
---------------------------------------------------------------
void CTestDoc::Sobel()
{
int centerValue1=0;
int centerValue2=0;
int sum=0;
unsigned char m_tmpImg[258][258];
int mask1[3][3]={ -1,0,1,
-2,0,2,
-1,0,1};
int mask2[3][3]={ 1,2,1,
0,0,0,
-1,-2,-1};
for(int k=1; k<257; k++){
for(int l=1; l<257; l++){
m_tmpImg[k][l]=m_OpenImg[k-1][l-1];
}
}
for(int row=0; row<256; row++){
for(int column=0; column<256; column++){
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
centerValue1 += m_tmpImg[i+row][j+column]*mask1[i][j];
centerValue2 += m_tmpImg[i+row][j+column]*mask2[i][j];
}
}
sum=abs(centerValue1)+abs(centerValue2);
if(sum>255)sum=255;
m_ResultImg[row+1][column+1]=(unsigned char)sum;
centerValue1=0;
centerValue2=0;
sum=0;
}
}
}
void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//Original Image 출력
for(int y=0; y<256; y++)
{
for(int x=0; x<256; x++)
{
pDC->SetPixel(x,y,RGB(pDoc->m_OpenImg[y][x],
pDoc->m_OpenImg[y][x],
pDoc->m_OpenImg[y][x]));
}
}
//Result Image 출력
if(zoom !=1 && zoom !=2)
{
for(y=0; y<256; y++)
{
for(int x=0; x<256; x++)
{
pDC->SetPixel(x+300,y,RGB(pDoc->m_ResultImg[y][x],
pDoc->m_ResultImg[y][x],
pDoc->m_ResultImg[y][x]));
}
}
}
---------------------------------------------------------------
델파이로
만들다 만 소스
//-------------------------------------------------------------/
// 소벨 연산 알고리즘 적용 (윤곽선 추출)
//-------------------------------------------------------------/
procedure Sobel(bmp1:TBitmap);
var
centervalue1,centervalue2,sum:Integer;
mask1 : array[0..2,0..2] of integer;
mask2 : array[0..2,0..2] of integer;
w_size,h_size, n,m,i,j:Integer;
begin
centervalue1:=0; centervalue2:=0; sum:=0; //변수 초기화
w_size:=bmp1.Width; h_size:=bmp1.Height; //이미지 사이즈 기억
mask1[0,0]:=-1; mask1[0,1]:=0; mask1[0,2]:=1;//x축 미분 변수
mask1[1,0]:=-2; mask1[1,1]:=0; mask1[1,2]:=2;
mask1[2,0]:=-1; mask1[2,1]:=0; mask1[2,2]:=1;
mask2[0,0]:=1; mask2[0,1]:=2; mask2[0,2]:=1;//y축 미분 변수
mask2[1,0]:=0; mask2[1,1]:=0; mask2[1,2]:=0;
mask2[2,0]:=-1; mask2[2,1]:=-2; mask2[2,2]:=-1;
for n:=0 to w_size-1 do begin
for m:=0 to h_size-1 do begin
for i:=0 to 2 do begin
for j:=0 to 2 do begin
centervalue1:=centervalue1+
bmp1.Canvas.Pixels[i+n,j+m] * mask1[i,j];
centervalue2:=centervalue2+
bmp1.Canvas.Pixels[i+n,j+m] * mask2[i,j];
end;
end;
sum:=abs(centervalue1)+ abs(centervalue2);//x,y 미분값 저장
if sum > 255 then sum:=255; //Saturation 기법 적용
bmp1.Canvas.Pixels[n+1,m+1]:= sum;
centervalue1:=0;
centervalue2:=0;
sum:=0;
end;
end
end;
//------------------------------------------------------------/
기본적인 이미지 프로세싱알고리즘을
델파이로 구현했구여...
Q/A가보시면 소스두 있을 거에여...
나노시스 //www.nanosys.co.kr