基於HSI和局部同態濾波的彩色圖像增強

簡介

在圖像採集過程中,由於光照環境或物體表面反光等原因會造成圖像光照不均 。圖像的光照不均會直接影響圖像分析的結果。因此,對光照不均圖像進行增強,消除光照的影響是光照不均圖像處理中不可缺少的環節 。同態濾波是光照不均圖像增強常用的方法。同態濾波增強是從圖像的整體角度對光照不均進行修正,雖然可以很好地保持圖像的原始面貌,但它沒有充分考慮圖像的空間局部特性,在增強圖像某部分像素時,易導致另一部分像素過增強 。因此,局部同態濾波算法對圖像的各個子圖像分別進行同態濾波,並對局部同態濾波產生的塊效應採用相鄰子圖像邊界平均的方法進行去除。

項目源碼地址://github.com/gain-wyj/Color-image-enhancement

歡迎大家star

HSI 顏色模型

HSI 顏色模型是一種直觀的顏色模型,它從人眼視覺系統出發,用 H(Hue)、S(Saturation)和 I(Intensity)分別表示色調、飽和度和亮度 3 種獨立的顏色特徵。HSI 模型的建立基於兩個重要的事實:其一,I 分量與圖像的彩色信息無關;其二,H 和 S 分量與人感受顏色的方式是一致的。這些特點使得 HSI 模型非常適合藉助於人的視覺系統來感知彩色特性的圖像處理算法。

色調H(Hue):與光波的頻率有關,它表示人的感官對不同顏色的感受,如紅色、綠色、藍色等,它也可表示一定範圍的顏色,如暖色、冷色等。

飽和度S(Saturation):表示顏色的純度,純光譜色是完全飽和的,加入白光會稀釋飽和度。飽和度越大,顏色看起來就會越鮮艷,反之亦然。

亮度I(Intensity):對應成像亮度和圖像灰度,是顏色的明亮程度。

若將RGB單位立方體沿主對角線進行投影,可得到六邊形,這樣,原來沿主對角線的灰色都投影到中心白色點,而紅色點(1,0,0)則位於右邊的角上,綠色點(0,1,0)位於左上角,藍色點(0,0,1)則位於左下角。

HSI顏色模型的雙六稜錐表示,I是強度軸,色調H的角度範圍為[0,2π],其中,純紅色的角度為0,純綠色的角度為2π/3,純藍色的角度為4π/3。飽和度S是顏色空間任一點距I軸的距離。當然,若用圓表示RGB模型的投影,則HSI色度空間為雙圓錐3D表示。

在這裡插入圖片描述

注意: 當強度I=0時,色調H、飽和度S無定義;當S=0時,色調H無定義。

RGB 模型轉換到 HSI 模型

給的一幅 RGB 彩色格式的圖像,對[0,1]範圍內的 R、G、B值,其對應的 HSI 模型中的 I、S、H 分量的計算公式分別為:

在這裡插入圖片描述

HSI 模型轉換到 RGB 模型

S 和 I 的值在[0,1]之間,R、G、B 的值也在[0,1]之間,HSI模型轉換為 RGB 模型的公式分為 3 段。

(1) 當 0° ≤ H < 120° 時:
在這裡插入圖片描述
(2) 當 120° ≤ H < 240° 時:
在這裡插入圖片描述
(3) 當 240° ≤ H < 360° 時:
在這裡插入圖片描述

同態濾波

從圖像的形成和光特性考慮,一幅圖像是由光源的照度分量 i(x,y) 和目標物的反射分量 r(x,y) 組成的,其數學模型為:f(x,y) = i(x,y)·r(x,y) ,式中,r(x,y) 的性質取決於成像物體的表面特性。

一般來說,光照條件體現在照度分量 i(x,y) 中,i(x,y) 變化緩慢,其頻譜主要落在低頻區域;而 r(x,y) 反映圖像的細節等特徵,其頻譜主要落在高頻部分。為此,只要從 f(x,y) 中將i(x,y)r(x,y) 分開,並分別採取壓縮低頻、提升高頻的方法,就可以達到減弱照度分量、增強反射分量從而使圖像清晰的目的 。

同態濾波的流程如圖所示。
在這裡插入圖片描述

基本思路

在 HSI 顏色空間下,對 I 分量進行處理,裁剪成 相同大小的 n×n 圖像塊,進行同態濾波,以此實現局部增強,但拼接圖像時,在邊緣必然會存在顏色突變,造成塊效應,因此需要解決這個副作用。將相鄰的圖像塊分為水平和豎直兩類,利用邊界處左右兩邊的像素進行均值濾波,以此來消除塊效應。增強後的 I 分量再重新與 S 和 H 分量組合併還原到 RGB 空間。
在這裡插入圖片描述

代碼實現

同態濾波實現

對彩色圖像進行同態濾波,首先需要將彩色圖像從 RGB 顏色空間轉換到 HSI 顏色空間,然後保持色調和飽和度分量不變,只對亮度分量進行同態濾波,最後再將處理後的圖像從 HSI 空間轉換到 RGB 顏色空間,得到增強後的彩色圖像。
HomoMor.m

function im_e = HomoMor(im,Hh,Hl,D0,c)
% 高斯同態濾波器參數的設置
% Hh = 1.2;  % 高頻增益,需要大於1
% Hl = 0.5;  % 低頻增益,取值在0和1之間
% D0 = 4;    % 截止頻率,越大圖像越亮
% c = 1;     % 銳化係數

%% 濾波器初始化
im = double(im);
[row, col] = size(im);

% 確定傅里葉變換的原點
x0 = floor(row/2);
y0 = floor(col/2);

% 初始化
H = zeros(row,col);

for i = 1:row
    for j = 1:col
        D = (i-x0)^2 + (j-y0)^2;
        if D == 0
            H(i,j) = Hl;
        else
            H(i,j) = (Hh-Hl) * (1 - exp(-c*D^2/(D0^2))) + Hl;  % 高斯同態濾波函數
        end
    end
end

%% 同態濾波
im_l = log(im + 0.000001);              % 取對數變換
im_f = fftshift(fft2(im_l));            % 傅里葉變換,並移到中心位置
im_nf = H .* im_f;                      % 高斯濾波
im_n = real(ifft2(ifftshift(im_nf)));   % 傅里葉反變換,恢複位置
im_e = exp(im_n - 0.000001);            % 取指數變化
end

HSV 顏色空間下的全局同態濾波

GlobalHomo.m

function rgbim = GlobalHomo(I,Hh,Hl,D0,c)
%全局同態濾波
% rgbim = GlobalHomo(I,Hh,Hl,D0,c)
% I:輸入圖像
% Hh:高頻增益,需要大於1
% Hl:低頻增益,取值在0和1之間
% D0:截止頻率,越大圖像越亮
% c:銳化係數

hsiim = rgb2hsi(I);
im = hsiim(:,:,3);
im_g = HomoMor(im,Hh,Hl,D0,c);
hsiim(:,:,3) = im_g;
rgbim = hsi2rgb(hsiim);
end

不加塊效應消除的分塊同態濾波

BlockHomo.m

function rgbim = BlockHomo(I,Hh,Hl,D0,c,block)
% rgbim = GlobalHomo(I,Hh,Hl,D0,c)
% I:輸入圖像
% Hh:高頻增益,需要大於1
% Hl:低頻增益,取值在0和1之間
% D0:截止頻率,越大圖像越亮
% c:銳化係數
% block:分塊大小


hsiim = rgb2hsi(I);
im = hsiim(:,:,3);

[row,col] = size(im);
% 塊的大小為Mb*Nb
Mb = block; Nb = block;
rb = floor(row/Mb); cb = floor(col/Nb);
im_g = im;
for i =1:rb
    for j = 1:cb
        temp = im((i-1)*Mb+1:i*Mb , (j-1)*Nb+1:j*Nb);
        im_g((i-1)*Mb+1:i*Mb , (j-1)*Nb+1:j*Nb) = HomoMor(temp,Hh,Hl,D0,c);
    end
end
hsiim(:,:,3) = im_g;
rgbim = hsi2rgb(hsiim);

end

加去除塊效應的分塊同態濾波

BlockHomo.m

function rgbim = BlockHomo(I,Hh,Hl,D0,c,block)
%分塊同態濾波
% rgbim = GlobalHomo(I,Hh,Hl,D0,c)
% I:輸入圖像
% Hh:高頻增益,需要大於1
% Hl:低頻增益,取值在0和1之間
% D0:截止頻率,越大圖像越亮
% c:銳化係數
% block:分塊大小


hsiim = rgb2hsi(I);
im = hsiim(:,:,3);

[row,col] = size(im);
% 塊的大小為Mb*Nb
Mb = block; Nb = block;
rb = floor(row/Mb); cb = floor(col/Nb);
im_g = im;
for i =1:rb
    for j = 1:cb
        temp = im((i-1)*Mb+1:i*Mb , (j-1)*Nb+1:j*Nb);
        im_g((i-1)*Mb+1:i*Mb , (j-1)*Nb+1:j*Nb) = HomoMor(temp,Hh,Hl,D0,c);
    end
end

% 分塊同態濾波 
M = 3; N = 3;
n0 = floor(N/2); m0 = floor(M/2);
Ide = im_g;

% 去除水平相鄰子圖像塊效應
for i = 1:row
    for j = Nb:Nb:col-Nb
        temp1 = 0;
        temp2 = 0;
        for k = -n0:n0
            temp1 = temp1 + im_g(i,j+k);
            temp2 = temp2 + im_g(i,j+1+k);
        end
        Ide(i,j) = temp1/N;
        Ide(i,j+1) = temp2/N;
    end
end
% 去除垂直相鄰子圖像塊效應
for i = Mb:Mb:row-Nb
    for j =  1:col
        temp1 = 0;
        temp2 = 0;
        for k = -m0:m0
            temp1 = temp1 + im_g(i+k,j);
            temp2 = temp2 + im_g(i+1+k,j);
        end
        Ide(i,j) = temp1/M;
        Ide(i+1,j) = temp2/M;
    end
end
hsiim(:,:,3) = Ide;
rgbim = hsi2rgb(hsiim);

end

局部平均信息熵

BlockAvEn.m

function en = BlockAvEn(I,block)
%局部平均信息熵
% en = BlockAvEn(I,block)
% I:輸入圖像
% block:分塊大小
en = 0;
[row,col,channel] = size(I);
% 塊的大小為Mb*Nb
Mb = block; Nb = block;
rb = floor(row/Mb); cb = floor(col/Nb);
for c = 1:channel
    im = I(:,:,c);
    for i =1:rb
        for j = 1:cb
            temp = im((i-1)*Mb+1:i*Mb , (j-1)*Nb+1:j*Nb);
            en = en + entropy(temp);
        end
    end
end
en = en/(rb*cb*channel);
end


實驗結果對比

fig.m

close all;clear;clc
addpath('model');
addpath('src');


%  讀取圖像
I = imread('4.1.01.tiff');
en = BlockAvEn(I,8);

% 全局同態濾波
rgbim0 =  GlobalHomo(I,1.2,0.5,50,1);
en0 = BlockAvEn(rgbim0,8);

% 局部同態濾波
rgbim1 = LocalHomo(I,1.2,0.5,4,1,8);
en1 = BlockAvEn(rgbim1,8);

% 分塊同態濾波 
rgbim2 = BlockHomo(I,1.2,0.5,4,1,8);
en2 = BlockAvEn(rgbim2,8);

figure(1)
subplot(1,4,1)
imshow(I);
title(['原始圖像:',num2str(en)])

subplot(1,4,2)
imshow(rgbim0);
title(['全局同態濾波:',num2str(en0)])

subplot(1,4,3)
imshow(rgbim1);
title(['局部同態濾波:',num2str(en1)])

subplot(1,4,4)
imshow(rgbim2);
title(['分塊同態濾波:',num2str(en2)])

結果

在這裡插入圖片描述

圖像 原文的局部平均信息熵 復現的局部平均信息熵
原始圖像 3.8476 3.8476
全局同態濾波 4.6636 4.6635
局部同態濾波 4.6848 4.6848
去除塊效應的局部同態濾波 4.6740 4.6758

從實驗結果可以看出,全局同態濾波在增強圖像某部分像素時,導致另一部分像素過增強,從而造成圖像細節的損失。而局部同態濾波考慮了圖像的局部特徵,增強之後的圖像光照均勻,明暗適中,細節清晰,且經過塊效應去除後,圖像有更好的視覺效果。