利用Sobel算子,求梯度图像

学习了Sobel算子,总结一下

上图中的模板为Sobel算子,之所以其中的系数是这样的,是因为和求他们偏导邻域的近似形式有关,具体请看书。

自己编写的利用Sobel算子,求梯度图像的matlab程序

 

%%%%%%%%%%%%%%%自编Sobel算子,求梯度图像%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%by席小贱   2017.12.15%%%%%%%%%%%%%%%%%%
clear;
close all;
%% 生成灰度图像
rgb_image = imread('F:\matlab\pic.jpg'); %写入RGB原图
gray_image = rgb2gray(rgb_image);        %将RGB转灰度图像
[row,col] = size(gray_image);            %正x轴向下延伸,正y轴向右延伸.size函数所对应的(row,col)分别是x行,y列
%% 原灰度图像一圈扩展1个像素
double_image = double(gray_image);
big_image = zeros(row+2,col+2);
for i = 2:row+1
    for j = 2:col+1
        big_image(i,j) = double_image(i-1,j-1);
    end
end
%% 设置Sobel算子x方向模板
Hx = [-1,-2,-1;0,0,0;1,2,1];
%% 设置Sobel算子y方向模板
Hy = Hx';
%% 编程序实现x方向梯度计算
gradx_image = zeros(row+2,col+2);
grady_image = zeros(row+2,col+2);
W = zeros(3,3);%移动窗口
for i = 1:row
    for j = 1:col
        %模板移动窗口
        W = [big_image(i,j),big_image(i,j+1),big_image(i,j+2);big_image(i+1,j),big_image(i+1,j+1),big_image(i+1,j+2);big_image(i+2,j),big_image(i+2,j+1),big_image(i+2,j+2)];
        Sx = Hx .* W;
        Sy = Hy .* W;
        gradx_image(i+1,j+1) = sum(sum(Sx));
        grady_image(i+1,j+1) = sum(sum(Sy));
    end
end
gradx_image = abs(gradx_image);
grady_image = abs(grady_image);
%% 将一圈扩展1个像素的图像复原
gradx = zeros(row,col);
grady = zeros(row,col);
for i = 1:row
    for j = 1:col
        gradx(i,j) = gradx_image(i+1,j+1);
        grady(i,j) = grady_image(i+1,j+1);
    end
end
%sobel梯度
grad = gradx + grady;  %得到图像的sobel梯度
%% 显示图像
figure();
subplot(2,2,1);imshow(gray_image);title('原图');
subplot(2,2,2);imshow(uint8(gradx),[]);title('x方向梯度(Sobel算子)');
subplot(2,2,3);imshow(uint8(grady),[]);title('y方向梯度(Sobel算子)');
subplot(2,2,4);imshow(grad,[]);title('图像的sobel梯度');

 

 

 

 

 

源自http://blog.csdn.net/zhufanqie/article/details/8709910

别人的程序,利用filter2函数

 

%% 利用filter2函数的sobel算子梯度计算实现
clear;
close all;
rgb_image = imread('F:\matlab\pic.jpg');
gray_image = rgb2gray(rgb_image);
%% 构造sobel模板
hx = [-1 -2 -1;0 0 0 ;1 2 1];%生产sobel垂直梯度模板
hy = hx';                    %生产sobel水平梯度模板
%% 计算图像的sobel梯度
%垂直梯度
gradx = filter2(hx,gray_image,'same');
gradx = abs(gradx); %计算图像的sobel垂直梯度
%水平梯度
grady = filter2(hy,gray_image,'same');
grady = abs(grady); %计算图像的sobel水平梯度
%sobel梯度
grad = gradx + grady;  %得到图像的sobel梯度
%% 显示
subplot(2,2,1);imshow(gray_image);title('原图');
subplot(2,2,2);imshow(gradx,[]);title('图像的sobel垂直梯度');
subplot(2,2,3);imshow(grady,[]);title('图像的sobel水平梯度');
subplot(2,2,4);imshow(grad,[]);title('图像的sobel梯度');

 

 

 

 

  • 14
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值