論文原文
項目地址
基本思路
在 HSI 顏色空間下,對 I 分量進行處理,裁剪成 相同大小的 n×n 圖像塊,進行同態濾波,以此實現局部增強,但拼接圖像時,在邊緣必然會存在顏色突變,造成塊效應,因此需要解決這個副作用。作者將相鄰的圖像塊分為水平和豎直兩類,利用邊界處左右兩邊的像素進行均值濾波,以此來消除塊效應。增強后的 I 分量再重新與 S 和 H 分量組合並還原到 RGB 空間。
代碼實現
作者在論文中已經給出了部分關鍵代碼,因此復現起來很簡單。
- 同態濾波實現
function im_e = HomoMor(im,Hh,Hl,D0,c)
%基於HSI和局部同態濾波的彩色圖像增強算法
% 作者: 張亞飛 謝明鴻
% 高斯同態濾波器參數的設置
% 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 顏色空間下的全局同態濾波
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
- 不加塊效應消除的分塊同態濾波
function rgbim = LocalHomo(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
- 加去除塊效應的分塊同態濾波
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
- 局部平均信息熵
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
- 結果對比
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 |
總結
根據復現結果來看,基本實現了與論文一致的增強效果。但仔細觀察發現,其實去除塊效應后的圖像仍存在一定的邊緣突變像素,因為濾波過程中,這些像素的值出現了過度增強,難以通過局部均值進行融合。