利用Sobel算子,求梯度图像

来源:互联网 发布:淘宝短网址生成 编辑:程序博客网 时间:2024/05/22 15:48

学习了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);    endend%% 设置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));    endendgradx_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);    endend%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梯度');


阅读全文
1 0