这里增加了对边沿像素的补齐。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算子。