当前位置: 代码迷 >> 综合 >> 图像边缘锐化- Sharpening filter, Unsharp masking Highboost filtering
  详细解决方案

图像边缘锐化- Sharpening filter, Unsharp masking Highboost filtering

热度:33   发布时间:2023-12-17 18:25:13.0

1. 锐化

使用二阶差分算子(也可以用一阶差分算子, 也就是梯度)提取图像边缘图像。将边缘图像加到源图像上,实现增强边缘的功能。

使用8联通算子比使用4联通算子更能增强对角线方向的边缘

%% 使用梯度算子增强图像边缘
% 基于DIP 3.6 Sharpening Spatial Filters
clear;clc;close all;
Lap4=[0 1 0; 1 -4 1;0 1 0];
Lap8=[1 1 1;1 -8 1;1 1 1];
ImgIn=single(imread('./DIP3E_Original_Images_CH03/Fig0338(a)(blurry_moon).tif'));
ImgLap4=imfilter(ImgIn,Lap4);
ImgLap8=imfilter(ImgIn,Lap8);
figure;
subplot(121);imshow(ImgLap4,[]);title('4联通二阶差分算子滤波结果');
subplot(122);imshow(ImgLap8,[]);title('8联通二阶差分算子滤波结果');
ImgSharp4=ImgIn-ImgLap4;
ImgSharp8=ImgIn-ImgLap8;
figure;imshow(ImgSharp4,[]);title('4联通二阶差分算子锐化结果');
figure;imshow(ImgSharp8,[]);title('8联通二阶差分算子锐化结果');

输出:
这里写图片描述

这里写图片描述

这里写图片描述

2. 反锐化

反锐化掩膜Unsharp Masking也可以用于增强图像的边缘:

  1. 模糊原图
  2. 原图减去模糊图,得到Mask
  3. Mask乘以一个正系数 k 加到原图上,输出。

k=1 , 算法称为Unsharp Masking;
k>1 , 算法称为Highboost filtering.

k值过大, 容易出现伪影; k值过小, 增强效果不明显.

%% 使用Unsharp Masking 和Highboost filter 增强边缘
clear;close all;clc;
GaussKernel=fspecial('gaussian',5,3);
ImgIn=single(imread('./DIP3E_Original_Images_CH03/Fig0340(a)(dipxe_text).tif'));
ImgBlur=imfilter(ImgIn,GaussKernel);
UnsharpMask=ImgIn-ImgBlur;
ImgUnsharp=ImgIn+UnsharpMask;
ImgHighBoost=ImgIn+4.5*UnsharpMask;
figure;
subplot(511);imshow(ImgIn,[]);title('原图');
subplot(512);imshow(ImgBlur,[]);title('高斯低通');
subplot(513);imshow(UnsharpMask,[]);title('Unsharp Mask');
subplot(514);imshow(ImgUnsharp,[]);title('k=1');
subplot(515);imshow(ImgHighBoost,[]);title('k=4.5');

输出:
这里写图片描述

3. 总结

  1. 以上两种方法都是对边缘图中各种强度的边缘做相同幅度的增强. 对于简单的图像可以取得满意的效果. 但是对于纹理尺度和幅度较为复杂的图像, 容易出现伪影. 更好的方法是对于不同的边缘强度采用不同的增强系数:
    a. 对于很强的边缘, 不增强或压制;
    b. 对于很弱的边缘, 认为是噪声, 不增强或者压制;
    c. 对于不很强也不很弱的边缘, 认为是目标纹理, 增强.
  2. 以上两种方法对不同尺度的边缘的增强系数都是一样的. 一般噪声都是高频噪声, 边缘尺度比较小. 所以:
    a. 小尺度的边缘要压制;
    b. 大尺度的边缘一般幅度较大, 可以不增强;
    c. 中间尺度的边缘一般是目标, 要增强.

4. 综合例子

这里写图片描述
这幅X光图像中, 噪声比较严重. 软组织和骨组织的对比度也比较差. 纹理边缘也不太清楚.
想要增强这幅图像, 应该怎么办呢?
考虑:
1. 二阶差分算子能够提取更细致的纹理, 但是容易引入噪声. 所以直接使用方法1会增强噪声.
2. 一阶差分算子只能够更好的提取较强的纹理, 所以相对来说, 噪声的幅度就小一些, 可以认为一阶差分对噪声不敏感.
所以,
可以结合两者的优点, 用一阶差分的结果去筛选二阶差分的结果. 可以较好地压制噪声.
1. 使用方法1求出二阶差分算子的锐化图. 此图噪声比较重, 对比度也差.
2. 使用一阶差分算子求原图的梯度图(梯度幅值都是非负的). 此图中, 噪声的梯度相对较小.
3. 对梯度图做5*5的平均滤波. 因为梯度图中, 真实边缘的梯度远大于噪声梯度, 所以使用平均滤波不会明显影响到图像的特征. 使用何种低通滤波器, 要结合图像中噪声的概率分布决定.
4. 使用低通梯度图点乘以步骤1中的锐化图, 得到Mask图. 要注意, 得到的Mask图中灰度值要和原图的灰度值大概在一个数量级上才可以. 所以, 要先对平滑梯度图做最大值归一化, 使得平滑梯度图的灰度值分布在0~1之间.
5. 把Mask图加到原图上, 得到了综合锐化图. 其特征纹理得到增强, 噪声也被压制.
6. 如果综合锐化图的对比度不满足要求. 可以做全局的灰度变换. 此处选择 γ=0.5 的gamma变换. 也就是将灰度值开根号. 也可以选择其他方法做灰度变换, 包括全局的和局部的灰度变换. 参考见图像对比度增强算法.

Matlab仿真代码如下:

%% 综合使用一阶和二阶差分算子增强图像
clear all;clc;close all;
Lap8=[-1 -1 -1;-1 8 -1;-1 -1 -1];
ImgIn=single(imread('./DIP3E_Original_Images_CH03/Fig0343(a)(skeleton_orig).tif'));
% 使用8连通拉普拉斯二阶差分算子
ImgLap8=imfilter(ImgIn,Lap8);
% 加到原图上
ImgSharpLap8=ImgIn+ImgLap8;
% 求原图的Sobel梯度
ImgSobel=imgradient(ImgIn);
% 平滑Sobel梯度
ImgSobelSmooth=imfilter(ImgSobel,ones(5)/25);
ImgSobelSmooth=ImgSobelSmooth./max(ImgSobelSmooth(:));
% 平滑的Sobel梯度乘以拉普拉斯锐化图
ImgMask=ImgSobelSmooth.*ImgSharpLap8;
% Mask加到原图上
ImgSharp=ImgMask+ImgIn;
% ImgSharp=ImgSharp-min(ImgSharp(:));
ImgSharp=abs(ImgSharp);
% 原图做log变换
% ImgSharpLog=log(ImgSharp);
ImgSharpPower=ImgSharp.^0.5;
figure;
subplot(221);imshow(ImgIn,[]);title('a. 原图');
subplot(222);imshow(ImgLap8,[]);title('b. 拉普拉斯算子提取边缘');
subplot(223);imshow(ImgSharpLap8,[]);title('c. 拉普拉斯算子增强');
subplot(224);imshow(ImgSobel,[]);title('d. Sobel梯度幅值');
figure;
subplot(221);imshow(ImgSobelSmooth,[]);title('e. Sobel梯度幅值平均滤波');
subplot(222);imshow(ImgMask,[]);title('f. Mask');
subplot(223);imshow(ImgSharp,[]);title('g. 锐化图');
subplot(224);imshow(ImgSharpPower,[]);title('h. 锐化图Gamma变换');

输出:
这里写图片描述

这里写图片描述

补充一点, 想要对图像做全局的灰度拉伸, 但是不知道使用哪种曲线, 可以使用PhotoShop 做灰度拉伸尝试一下.
操作方法: 菜单->图像->调整->曲线.
可以随意设置拉伸曲线.
这里写图片描述

  相关解决方案