Matlab采用梯度算子、拉普拉斯算子、Sobel算子及Prewitt算子对图像进行锐化

梯度算子

设图像为f(x,y), 定义为f(x,y)在点(x,y)的梯度矢量为G[f(x,y)]:
在这里插入图片描述
性质:
1)梯度的方向是在f(x,y)的最大变化率方向上
2)梯度的幅度用G[f(x,y)]表示:
在这里插入图片描述
梯度
对于数字图像:
在这里插入图片描述
简化为:
在这里插入图片描述
Roberts梯度(交叉梯度)
对于数字图像:
在这里插入图片描述
简化为:
在这里插入图片描述

拉普拉斯算子

拉普拉斯算子:

线性、各向同性(旋转不变)在这里插入图片描述
在这里插入图片描述
对于数字图像f(i,j),其一阶导数:
在这里插入图片描述
二阶偏导数为:
在这里插入图片描述
拉普拉斯算子模板表示
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
注意:
1)有时g(x,y)输出小或为负
2)有时g(x,y)的增强可能超出范围,需要变回0~L-1尺度中

Robel算子

基本思想
以待增强图像的任意像素(i,j)为中心,截取一个3X3的像素窗口,先分别计算窗口中像素在x,y方向的梯度:
在这里插入图片描述
在这里插入图片描述
增强后(i,j)点的亮度:
在这里插入图片描述
可简化为:
在这里插入图片描述
优点
1)由于引入了加权平均,所以对图像中的随机噪声具有一定的平滑作用
2)由于采用间隔两行或两列的查分,边缘两侧的像素得到增强,锐化图像的边缘显得粗而亮
S_x,S_y可用卷积模板来实现:
在这里插入图片描述
在这里插入图片描述
可见:其重点放在接近于模板中心的像素点

Prewitt算子

基本思想
与Sobel算子相同,方程的形式相同,但其中系数不同:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可见:与Sobel算子不同,其重点没有放在接近于模板中心的像素点

整体程序:

clc;
clear all;
img = imread('F:\1.jpg');
img = rgb2gray(img);
subplot(2,3,1);
imshow(img);
title('原始图像');
[m,n] = size(img);
T = 20;

%Roberts算子
imgr = zeros(m,n);
for i=2:m-1
    for j=2:n-1
        imgr(i,j)= abs(img(i,j)-img(i+1,j+1)) + abs(img(i+1,j)-img(i,j+1));
        if imgr(i,j)<T
            imgr(i,j) = 0;
        else
            imgr(i,j) = 255;
        end
    end
end
subplot(2,3,2);
imshow(imgr);
title('Roberts算子图像');

%Laplace算子
imgl = zeros(m,n);
for i=2:m-1
    for j=2:n-1
        imgl(i,j)= abs(img(i+1,j)+img(i-1,j)+img(i,j+1)+img(i,j-1)-4*img(i,j));
        if imgl(i,j)<T
            imgl(i,j) = 0;
        else
            imgl(i,j) = 255;
        end
    end
end
subplot(2,3,3);
imshow(imgl);
title('Laplace算子图像');

%Sobel算子
imgs = zeros(m,n);
for i=2:m-1
    for j=2:n-1
        imgs(i,j)= abs(img(i-1,j+1)+2*img(i,j+1)+img(i+1,j+1)-img(i-1,j-1)-2*img(i,j-1)-img(i+1,j-1)) + abs(img(i+1,j-1)+2*img(i+1,j)+img(i+1,j+1)-img(i-1,j-1)-2*img(i-1,j)-img(i-1,j+1));
        if imgs(i,j)<T
            imgs(i,j) = 0;
        else
            imgs(i,j) = 255;
        end
    end
end
subplot(2,3,4);
imshow(imgs);
title('Sobel算子图像');

%Prewitt算子
imgp = zeros(m,n);
for i=2:m-1
    for j=2:n-1
        imgp(i,j)= abs(img(i-1,j+1)+img(i,j+1)+img(i+1,j+1)-img(i-1,j-1)-img(i,j-1)-img(i+1,j-1)) + abs(img(i+1,j-1)+img(i+1,j)+img(i+1,j+1)-img(i-1,j-1)-img(i-1,j)-img(i-1,j+1));
        if imgp(i,j)<T
            imgp(i,j) = 0;
        else
            imgp(i,j) = 255;
        end
    end
end
subplot(2,3,5);
imshow(imgp);
title('Prewitt算子图像');

结果显示:

在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐