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

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

时间: 2024-08-06 13:09:03

sobel算子实现边缘检测及其c++实现及与matlab效果对比的相关文章

Sobel算子 (转)

幻灯片1 Sobel算子 幻灯片2 一.Sobel边缘检测算子 l 在讨论边缘算子之前,首先给出一些术语的定义: l (1)边缘:灰度或结构等信息的突变处,边缘是一个区域的结束,也是另一个区域的开始,利用该特征可以分割图像. l (2)边缘点:图像中具有坐标[x,y],且处在强度显著变化的位置上的点. l (3)边缘段:对应于边缘点坐标[x,y]及其方位 ,边缘的方位可能是梯度角. 幻灯片3 二.Sobel算子的基本原理 l Sobel算子是一阶导数的边缘检测算子,在算法实现过程中,通过3×3模

学习 opencv---(11)OpenC 边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器

本篇文章中,我们将一起学习OpenCV中边缘检测的各种算子和滤波器--Canny算子,Sobel算子,Laplace算子以及Scharr滤波器.文章中包含了五个浅墨为大家准备的详细注释的博文配套源代码.在介绍四块知识点的时候分别一个,以及最后的综合示例中的一个.文章末尾提供配套源代码的下载. **** 给大家分享一个OpenCv中写代码是节约时间的小常识.其实OpenCv中,不用nameWindow,直接imshow就可以显示出窗口.大家看下文的示例代码就可以发现,浅墨在写代码的时候并没有用na

图像边缘检测——Sobel算子

边缘是图像最基本的特征,其在计算机视觉.图像分析等应用中起着重要的作用,这是因为图像的边缘包含了用于识别的有用信息,是图像分析和模式识别的主要特征提取手段. 1.何为“图像边缘”? 在图像中,“边缘”指的是临界的意思.一幅图像的“临界”表示为图像上亮度显著变化的地方,边缘指的是一个区域的结束,也是另一个区域的开始.“边缘点”指的是图像中具有坐标[x,y],且处在强度显著变化的位置上的点. 2.如何表示边缘检测? 在数学上,用导数来表示改变的快慢.基于此,有许多方法用于边缘检测,他们绝大部分可以划

sobel算子边缘检测

图像边缘:经典的边缘提取方法是考察图像的每个像素在某个邻域内灰度的变化,利用边缘临近一阶或二阶方向导数变化规律,用简单的方法检测边缘.这种方法称为边缘检测局部算子法. 在计算机中一般采用离散的方法来求,并不会进行求到,这就产生了最基本的图像处理算子——sobel算子. 写了一半,占个坑...图片传不上了,心酸.

【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们将一起学习OpenCV中

【opencv入门之九】Opencv边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器

参考网站: http://blog.csdn.net/poem_qianmo/article/details/25560901 1.边缘检测步骤 1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感.( 通常用高斯滤波 ) 2)增强:增强边缘的基础是确定图像各点领域强度的变化值.增强算法可以将图像灰度点领域强度值有显著变化的点凸显出来.( 可以通过计算梯度幅值来确定 ) 3)检测:经过增强的图像,往往领域中有很多点的梯度值比较大,而特定的应用中,这些点并不是我们要找

OpenCV——边缘检测(sobel算子、Laplacian算子、scharr滤波器)

1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 4 using namespace cv; 5 using namespace std; 6 7 8 int main(int argc, char** argv) 9 { 10 Mat src = imread("test.jpg"); 11 Mat dst, gray,grad_x, gray_y,abs_grad_x,abs_grad_y; 12

sobel算子原理与实现

一.原理: 首先介绍背景知识: 1)边缘:灰度或结构等信息的突变处,边缘是一个区域的结束,也是另一个区域的开始,利用该特征可以分割图像. 2)边缘点:图像中具有坐标[x,y],且处在强度显著变化的位置上的点. 3)边缘段:对应于边缘点坐标[x,y]及其方位 ,边缘的方位可能是梯度角. 索贝尔算子(Sobeloperator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值.在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量. 为了节省时间,我就直接

《OpenCV:Sobel算子理论与OpenCV代码实现》

索贝尔算子(Sobeloperator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值.在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量 Sobel卷积因子为: 该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值.如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像灰度值,其公式如下: 具体计算如下: 图像的每一个像素的横向及纵向灰度值通过以下公式结合,来计算该点灰度的大小: