圖像邊緣銳化- Sharpening filter, Unsharp masking & Highboost filtering

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 做灰度拉伸嘗試一下.
操作方法: 菜單->圖像->調整->曲線.
可以隨意設置拉伸曲線.
這裏寫圖片描述

發佈了91 篇原創文章 · 獲贊 41 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章