程序员人生 网站导航

sobel算子实现边缘检测及其c++实现及与matlab效果对比

栏目:综合技术时间:2015-04-30 08:16:20

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


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐