Matlab-代码实现微分算子锐化
图像锐化的目的是使模糊的图像变清晰(这种模糊是在数据获取过程中,由于操作失误导致或经过特殊方法处理后的结果),增强图像的边缘等细节。图像锐化增强边缘的同时会增强噪声,因此一般先去除或减轻噪声,再进行锐化处理。图像锐化可以在空间域或频率域通过高通滤波来实现,即减弱或消除低频分量而不影响高频分量。空间域高通滤波主要通过模板卷积来实现。
一阶微分算子提取边缘
一阶微分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function G = Rob(F, Dx, Dy) %当模板为2*2的矩阵,例如Roberts算子 [m, n] = size (F); %获取图像大小 h = 2; for i = 1: m for j = 1: n if (( i < h)|| ( j < h)) %图像不能被处理的区域 G( i , j ) = double (F( i , j )); continue ; %像素值不变 end %取同样大小的图像块,右下角的像素是待处理的像素 T = double (F( i -1: i , j -1: j )); T1 = Dx.*T; %水平模板处理后的矩阵 T2 = Dy.*T; %垂直模板处理后的矩阵 G( i , j ) = ( sum (T1(:))^2+ sum (T2(:))^2)^0.5; %计算总梯度 end end %将计算结果调整到[0,255]的范围 Min = min (G(:)); Max = max (G(:)); s = 255/(Max-Min); G = uint8 ((G-Min)*s); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | function G = PreSob(F, Dx, Dy) %当模板的维度为奇数,例如水平方向一阶锐化和Sobel算子等 [m, n] = size (F); %获取图像大小 [N, N] = size (Dx); %获取模板大小 h = (N+1)/2; for i = 1:m for j = 1:n if (( i < h)|| ( j < h)|| ( i > m-h+1)|| ( j > n-h+1)) %图像不能被处理的区域 G( i , j ) = double (F( i , j )); continue ; %像素值不变 end %取同样大小的图像块,中间的像素是待处理的像素 T = double (F( i -h+1: i +h-1, j -h+1: j +h-1)); T1 = Dx.*T; %水平模板处理后的矩阵 T2 = Dy.*T; %垂直模板处理后的矩阵 G( i , j ) = ( sum (T1(:))^2+ sum (T2(:))^2)^0.5; %计算总梯度 end end %将计算结果调整到[0,255]的范围 Min = min (G(:)); Max = max (G(:)); s = 255/(Max-Min); G = uint8 ((G-Min)*s); |
调用函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | %% 一阶微分锐化 F = imread ( 'building.jpg' ); subplot (2,2,1), imshow(F); title ( "原图" ); %Roberts算法 Dx = [1 0; 0 -1]; Dy = [0 -1; 1 0]; G = Rob(F, Dx, Dy); subplot (2,2,2), imshow(G); title ( "Roberts算法" ); %Prewitt算子 Dx = [-1 0 1; -1 0 1; -1 0 1]; Dy = [1 1 1; 0 0 0; -1 -1 -1]; G = PreSob(F, Dx, Dy); subplot (2,2,3), imshow(G); title ( "Prewitt算子" ); %Sobel算子 Dx = [-1 0 1; -2 0 2; -1 0 1]; Dy = [1 2 1; 0 0 0; -1 -2 -1]; G = PreSob(F, Dx, Dy); subplot (2,2,4), imshow(G); title ( "Sobel算子" ); |
结果显示
二阶微分算子锐化图像
Laplacian算子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | function G = Laplacian(F, D, Add) [m,n] = size (F); %图像大小 [N,N] = size (D); %模板大小 h = (N+1)/2; for i = 1: m for j = 1: n if (( i < h)|| ( j < h)|| ( i > m-h+1)|| ( j > n-h+1)) %图像不能被处理的区域 G( i , j ) = double (F( i , j )); continue ; %像素值不变 end %取同样大小的图像块,中间的像素是待处理的像素 T = double (F( i -h+1: i +h-1, j -h+1: j +h-1)); T = T.*D; %和模版相乘 G( i , j ) = abs ( sum (T(:))); %求和并取绝对值 end end if (Add == false) %锐化图像 %将计算结果调整到[0,255]的范围 Min = min (G(:)); Max = max (G(:)); s = 255/(Max-Min); G = uint8 ((G-Min)*s); else %锐化图像叠加到原图像 G = uint8 (G+ double (F)); end |
调用函数
1 2 3 4 5 6 7 8 9 10 | %% 二阶微分锐化 F = imread ( 'building.jpg' ); subplot (1,3,1), imshow(F); title ( "原图" ); %Laplacian算法 D = [0 -1 0; -1 4 -1; 0 -1 0]; G = Laplacian(F, D, false); subplot (1,3,2), imshow(G); title ( "边缘提取" ); G = Laplacian(F, D, true); subplot (1,3,3), imshow(G); title ( "锐化图像" ); |
结果显示
本文作者:khrushchefox
本文链接:https://www.cnblogs.com/khrushchefox/p/16108263.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步