《数字图像处理》——图像的一阶微分之图像梯度

     首先要知道梯度是个什么概念,在数学中我们知道梯度是一个向量,函数在一点的梯度在数学上它是这么定义的:它的方向是函数在这点的方向导数取得最大值的方向,它的模就等于方向导数的最大值。


   梯度经常用robert交叉微分算子,Prewitt微分算子,sobel算子来实现。


   梯度经常应用在图像的边缘检测和边缘增强上面,这和它的一阶微分性质有关。


   梯度赋值具有旋转不变性。


   下面实现一个sobel实现边缘检测:

close all;clear all;clc;
%input = [1 1 1 1 1; 1 1 1 1 2 ;1 1 1 1 1 ];
input = imread('lena.bmp');
% mask = 1 / 16 * [1 2 1; 2 4 2; 1 2 1];  % 考虑3*3的滤波模板
mask = [1 2 1;0 0 0 ;-1 -2 -1]; % sobel算法(注意需要求两个边缘)

% 使用库函数实现(在对sobel求取边缘的时候貌似也得分别求水平和垂直边缘)
img_h = imfilter(double(input), mask, 'conv', 0, 'full');     %求竖边缘
img_w = imfilter(double(input), mask','conv', 0, 'full');     %求横边缘
output1 = sqrt(img_w.^2 + img_h.^2);        % 注意这里不是简单的求平均,而是平方和在开方

% 下面自己实现
[m, n] = size(input);
% 先填充输入图像,这里依旧通过0来填充外边界
input_temp = zeros(m + 4, n + 4);

% 初始化输入图像
input_temp(3: m + 3 - 1, 3: n + 3 - 1) = input;

% 让模板滑过扩展的输入向量
xx = size(input_temp, 1) - 3 + 1;
yy = size(input_temp, 2) - 3 + 1;
output = zeros(xx,yy);

for i = 1: xx
    for j = 1: yy
        output(i, j) = sum( sum( input_temp(i: i + 3 - 1 , j : j + 3 - 1) .* mask ) ) ;    % 求竖边缘
    end
end
for i = 1: xx
    for j = 1: yy
        %注意这里不是简单的求平均,而是平方和在开方。
        output(i, j) = sqrt( output(i,j)^2 + sum( sum( input_temp(i: i + 3 - 1 , j : j + 3 - 1) .* mask' ) )^2 ); % 求横边缘
    end
end
fprintf('调用库函数imfilter完成相关运算');
% output1
% output
subplot(131);imshow( uint8(input) );  title('原图像');
subplot(132);imshow( uint8(output1) );title('调用库函数实现sobel边缘检测');
subplot(133);imshow( uint8(output) ); title('自己实现sobel边缘检测');

% 看自己的滤波函数是否有问题
equal = sum(sum(output1 ~= output))   % equal = 0 表示处理后的结果一样

运行结果图:

《数字图像处理》——图像的一阶微分之图像梯度_第1张图片

调用库函数imfilter完成相关运算
equal =

       0    

equal等于0,表明自己实现的均值滤波和库函数得到同样的结果。


ok,搞定!!!!



你可能感兴趣的:(数字图像处理)