?? sobel.txt
字號(hào):
所謂邊緣就是指圖像局部亮度變化最顯著的部分,它是檢測(cè)圖像局部變化顯著變化的最基本的運(yùn)算。對(duì)于數(shù)字圖像,圖像灰度灰度值的顯著變化可以用梯度來(lái)表示,以邊緣檢測(cè)Sobel算子為例來(lái)講述數(shù)字圖像處理中邊緣檢測(cè)的實(shí)現(xiàn):
對(duì)于數(shù)字圖像,可以用一階差分代替一階微分;
△xf(x,y)=f(x,y)-f(x-1,y);
△yf(x,y)=f(x,y)-f(x,y-1)
求梯度時(shí)對(duì)于平方和運(yùn)算及開(kāi)方運(yùn)算,可以用兩個(gè)分量的絕對(duì)值之和表示,即:
G[f(x,y)]={[△xf(x,y)] +[△yf(x,y)] } |△xf(x,y)|+|△yf(x,y)|;
Sobel梯度算子是先做成加權(quán)平均,再微分,然后求梯度,即:
△xf(x,y)= f(x-1,y+1) + 2f(x,y+1) + f(x+1,y+1)- f(x-1,y-1) - 2f(x,y-1) - f(x+1,y-1);
△yf(x,y)= f(x-1,y-1) + 2f(x-1,y) + f(x-1,y+1)- f(x+1,y-1) - 2f(x+1,y) - f(x+1,y+1);
G[f(x,y)]=|△xf(x,y)|+|△yf(x,y)|;
上述各式中的像素之間的關(guān)系見(jiàn)圖
f(x-1,y-1) f(x,y-1) f(x+1,y-1)
f(x-1,y) f(x,y) f(x+1,y)
f(x-1,y+1) f(x,y+1) f(x+1,y+1)
我在視圖類中定義了響應(yīng)菜單命令的邊緣檢測(cè)Sobel算子實(shí)現(xiàn)灰度圖像邊緣檢測(cè)的函數(shù):
void CDibView::OnMENUSobel()
//灰度圖像數(shù)據(jù)的獲得參見(jiàn)天極網(wǎng)9.10日發(fā)表的拙作//VC數(shù)字圖像處理一文
{
HANDLE data1handle;
LPBITMAPINFOHEADER lpBi;
CDibDoc *pDoc=GetDocument();
HDIB hdib;
unsigned char *hData;
unsigned char *data;
hdib=pDoc->m_hDIB;
BeginWaitCursor();
lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);
hData= lpbi +* (LPDWORD)lpbi + 256*sizeof(RGBQUAD);
//得到指向位圖像素值的指針
pDoc->SetModifiedFlag(TRUE);//設(shè)修改標(biāo)志為"TRUE"
data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight);
//申請(qǐng)存放處理后的像素值的緩沖區(qū)
data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);
AfxGetApp()->BeginWaitCursor();
int i,j,buf,buf1,buf2;
for( j=0; jbiHeight; j++)//以下循環(huán)求(x,y)位置的灰度值
for( i=0; ibiWidth; i++)
{
if(((i-1)>=0)&&((i+1)biWidth)&&((j-1)>=0)&&((j+1)biHeight))
{//對(duì)于圖像四周邊界處的向素點(diǎn)不處理
buf1=(int)*(hData+(i+1)*WIDTHBYTES(lpBi->biWidth*8)+(j-1))
+2*(int)*(hData+(i+1)*WIDTHBYTES(lpBi->biWidth*8)+(j))
+(int)(int)*(hData+(i+1)*WIDTHBYTES(lpBi->biWidth*8)+(j+1));
buf1=buf1-(int)(int)*(hData+(i-1)*WIDTHBYTES(lpBi->biWidth*8)+(j-1))
-2*(int)(int)*(hData+(i-1)*WIDTHBYTES(lpBi->biWidth*8)+(j))
-(int)(int)*(hData+(i-1)*WIDTHBYTES(lpBi->biWidth*8)+(j+1));
//x方向加權(quán)微分
buf2=(int)(int)*(hData+(i-1)*WIDTHBYTES(lpBi->biWidth*8)+(j+1))
+2*(int)(int)*(hData+(i)*WIDTHBYTES(lpBi->biWidth*8)+(j+1))
+(int)(int)*(hData+(i+1)*WIDTHBYTES(lpBi->biWidth*8)+(j+1));
buf2=buf2-(int)(int)*(hData+(i-1)*WIDTHBYTES(lpBi->biWidth*8)+(j-1))
-2*(int)(int)*(hData+(i)*WIDTHBYTES(lpBi->biWidth*8)+(j-1))
-(int)(int)*(hData+(i+1)*WIDTHBYTES(lpBi->biWidth*8)+(j-1));
//y方向加權(quán)微分
buf=abs(buf1)+abs(buf2);//求梯度
if(buf>255) buf=255;
if(buf<0){buf=0;
*(data+i*WIDTHBYTES(lpBi->biWidth*8)+j)=(BYTE)buf;
}
else *(data+i*lpBi->biWidth+j)=(BYTE)0;
}
for( j=0; jbiHeight; j++)
for( i=0; ibiWidth; i++)
*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)=*(data+i*WIDTHBYTES(lpBi->biWidth*8)+j);
//處理后的數(shù)據(jù)寫(xiě)回原緩沖區(qū)
AfxGetApp()->EndWaitCursor();
GlobalUnlock((HGLOBAL)hdib);
GlobalUnlock(data1handle);
GlobalFree(date1handle);
EndWaitCursor();
Invalidate(TRUE);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -