Matlab-代碼實現微分算子銳化


圖像銳化的目的是使模糊的圖像變清晰(這種模糊是在數據獲取過程中,由於操作失誤導致或經過特殊方法處理后的結果),增強圖像的邊緣等細節。圖像銳化增強邊緣的同時會增強噪聲,因此一般先去除或減輕噪聲,再進行銳化處理。圖像銳化可以在空間域或頻率域通過高通濾波來實現,即減弱或消除低頻分量而不影響高頻分量。空間域高通濾波主要通過模板卷積來實現。

 

一階微分算子提取邊緣

一階微分

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);

  

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);

調用函數

%% 一階微分銳化
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算子

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

調用函數

%% 二階微分銳化
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("銳化圖像");

結果顯示

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM