sobel算子實現邊緣檢測及其c++實現及與matlab效果對比
來源:程序員人生 發布時間:2015-04-30 08:16:20 閱讀次數:6147次
這里增加了對邊沿像素的補齊。sobel梯度分割抗噪性好,但是沒法做到自動閾值,是其1大遺憾,matlab卻解決的很好。

//默許對8位位圖進行處理
void Sobel(unsigned char *pIn, int width, int height, unsigned char *pOut)
{
//每行像素所占字節數,輸出圖象與輸入圖象相同
int lineByte=(width+3)/4*4;
//申請輸出圖象緩沖區
pOut=new unsigned char[lineByte*height];
//循環變量,圖象的坐標
int i,j;
//中間變量
int x, y, t;
//Sobel算子
for(i=1;i<height⑴;i++)
{
for(j=1;j<width⑴;j++)
{
//x方向梯度
x= *(pIn+(i⑴)*lineByte+j+1)
+ 2 * *(pIn+i*lineByte+j+1)
+ *(pIn+(i+1)*lineByte+j+1)
- *(pIn+(i⑴)*lineByte+j⑴)
- 2 * *(pIn+i*lineByte+j⑴)
- *(pIn+(i+1)*lineByte+j⑴);
//y方向梯度
y= *(pIn+(i⑴)*lineByte+j⑴)
+ 2 * *(pIn+(i⑴)*lineByte+j)
+ *(pIn+(i⑴)*lineByte+j+1)
- *(pIn+(i+1)*lineByte+j⑴)
- 2 * *(pIn+(i+1)*lineByte+j)
- *(pIn+(i+1)*lineByte+j+1);
t=abs(x)+abs(y)+0.5;
if (t>100)
{
*(pOut+i*lineByte+j)=255;
}
else
{
*(pOut+i*lineByte+j)=0;
}
}
}
for(j=0;j<width;j++)
{
*(pOut+(height⑴)*lineByte+j)=0;//補齊最后1行
*(pOut+j)=0;//補齊第1行
}
for(i=0;i<height;i++)
{
*(pOut+i*lineByte)=0;//補齊第1列
*(pOut+i*lineByte+width⑴)=0;//補齊最后1列
}
}
}

image=imread('C:UsersLiuDesktoplenna.bmp');
Info=imfinfo('C:UsersLiuDesktoplenna.bmp'); %讀圖象信息,并判斷是不是是灰度圖
if Info.BitDepth>8
image=rgb2gray(image);
end
BW=edge(image,'sobel');
imshow(BW)
乃至對照opencv,matlab的效果也略勝1籌,接下來希望深入matlab底層,用c++實現matlab的sobel算子。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈