码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-04-08 13:16:11      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:c++   sobel   

这里增加了对边缘像素的补齐。sobel梯度分割抗噪性好,但是无法做到自动阈值,是其一大遗憾,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-1;i++)
	{
		for(j=1;j<width-1;j++)
		{
				//x方向梯度
				x= *(pIn+(i-1)*lineByte+j+1)
				 + 2 * *(pIn+i*lineByte+j+1)
				 + *(pIn+(i+1)*lineByte+j+1)
				 - *(pIn+(i-1)*lineByte+j-1)
				 - 2 * *(pIn+i*lineByte+j-1)
				 - *(pIn+(i+1)*lineByte+j-1);

				//y方向梯度
				y= *(pIn+(i-1)*lineByte+j-1)
					+ 2 * *(pIn+(i-1)*lineByte+j)
					+ *(pIn+(i-1)*lineByte+j+1)
					- *(pIn+(i+1)*lineByte+j-1)
					- 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-1)*lineByte+j)=0;//补齐最后一行
			*(pOut+j)=0;//补齐第一行
	}
 	for(i=0;i<height;i++)
 	{
			*(pOut+i*lineByte)=0;//补齐第一列
			*(pOut+i*lineByte+width-1)=0;//补齐最后一列
		}
 	}
}
技术分享技术分享

image=imread('C:\\Users\\Liu\\\Desktop\\lenna.bmp');
Info=imfinfo('C:\\Users\\Liu\\\Desktop\\lenna.bmp');  %读图像信息,并判断是否是灰度图
if Info.BitDepth>8
image=rgb2gray(image);
end
BW=edge(image,'sobel');
imshow(BW)
技术分享

甚至对比opencv,matlab的效果也略胜一筹,接下来希望深入matlab底层,用c++实现matlab的sobel算子。


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

标签:c++   sobel   

原文地址:http://blog.csdn.net/lsh_2013/article/details/44938423

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!