sobel的matlab实现,Sobel算法

sobel的matlab实现,Sobel算法1 2 1 Sobel 算法分析索贝尔算子 Sobeloperato 主要用作边缘检测 在技术上 它是一离散性差分算子 用来运算图像亮度函数的灰度之近似值 在图像的任何一点使用此算子 将会产生对应的灰度矢量或是其法矢量 Sobel 卷积因子为 该算子包含两组 3×3 的矩阵 分别为横向及纵向 将之与图像作平面卷积 即可分别得出横向及纵向的亮度差分近似值 如果以 A 代表原始图像 Gx 及 Gy 分别代表经横向及

1.2.1. Sobel算法分析

索贝尔算子(Sobel

operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量。

Sobel卷积因子为:

a4c26d1e5885305701be709a3d33442f.png

该算子包含两组3×3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像灰度值,其公式如下:

a4c26d1e5885305701be709a3d33442f.png

图像的每一个像素的横向及纵向灰度值通过以下公式结合,来计算该点灰度的大小:

a4c26d1e5885305701be709a3d33442f.png

通常,为了提高效率 使用不开平方的近似值,但这样做会损失精度

a4c26d1e5885305701be709a3d33442f.png

如果梯度G大于某一阀值 则认为该点(x,y)为边缘点。

if(temp3 > THRESHOLD)

IMG_Sobel(i,j) =

0; %Black

else

IMG_Sobel(i,j) = 255; %White

end

然后可用以下公式计算梯度方向(当然只要检测边缘,则不用计算方向):

a4c26d1e5885305701be709a3d33442f.png

1.2.2. Sobel算子Matlab算法的实现

Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。

Soble算子操作的是灰度图像,因此必须首先对图像进行灰度化。这一部分在第一章中详细介绍过,不再做具体分析,一下算法直接应用灰度图像。

(1)Sobel算子卷积

%

———————————————————————–

% Gx Gy Pixel

% [ -1 0 +1 ] [ +1 +2 +1

] [ P1 P2 P3 ]

% [ -2 0 +2 ] [ 0 0 0 ] [ P4 P5 P6 ]

% [ -1 0 +1 ] [ -1 -2 -1

] [ P7 P8 P9 ]

Sobel_X = [-1, 0, 1, -2, 0, 2, -1, 0,

1]; % Mask x

Sobel_Y = [1, 2, 1, 0, 0, 0, -1, -2,

-1]; % Mask y

(2)点对点卷积运算实现梯度的计算

IMG_Gray =

double(IMG2); %将图片转换为双精度类型

IMG_Sobel =

true(h,w); %新建一个二值矩阵

THRESHOLD =90;

for i = 2 :

h-1 %舍弃了边缘信息

for j = 2 :

w-1

temp1 = Sobel_X(1) * IMG_Gray(i-1,j-1) +

Sobel_X(2) * IMG_Gray(i-1,j) + Sobel_X(3) *

IMG_Gray(i-1,j+1) +…

Sobel_X(4) *

IMG_Gray(i,j-1) + Sobel_X(5) *

IMG_Gray(i,j) + Sobel_X(6) * IMG_Gray(i,j+1) +…

Sobel_X(7) * IMG_Gray(i+1,j-1) + Sobel_X(8) *

IMG_Gray(i+1,j) + Sobel_X(9) *

IMG_Gray(i+1,j+1);

temp2 = Sobel_Y(1) * IMG_Gray(i-1,j-1) +

Sobel_Y(2) * IMG_Gray(i-1,j) + Sobel_Y(3) *

IMG_Gray(i-1,j+1) +…

Sobel_Y(4) *

IMG_Gray(i,j-1) + Sobel_Y(5) *

IMG_Gray(i,j) + Sobel_Y(6) * IMG_Gray(i,j+1) +…

Sobel_Y(7) * IMG_Gray(i+1,j-1) + Sobel_Y(8) *

IMG_Gray(i+1,j) + Sobel_Y(9) *

IMG_Gray(i+1,j+1);

temp3 = sqrt(temp1^2 + temp2^2);

%temp3 = abs(temp1) +

abs(temp2); %just for speed

if(temp3 > THRESHOLD)

IMG_Sobel(i,j) = 0; %Black

else

IMG_Sobel(i,j) = 1; %White

end

end

end

(3)THRESHOLD为手动设定,此处为90。根据图像的质量来调节,针对于边缘检测而言,不需要进行梯度方向计算,因此直接进行梯度计算,与阀值对比,既可以实现边缘检测。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218430.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午7:16
下一篇 2026年3月18日 上午7:17


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号