论文原文
基于HSI和局部同态滤波的彩色图像增强算法
项目地址
基本思路
在 HSI 颜色空间下,对 I 分量进行处理,裁剪成 相同大小的 n×n 图像块,进行同态滤波,以此实现局部增强,但拼接图像时,在边缘必然会存在颜色突变,造成块效应,因此需要解决这个副作用。作者将相邻的图像块分为水平和竖直两类,利用边界处左右两边的像素进行均值滤波,以此来消除块效应。增强后的 I 分量再重新与 S 和 H 分量组合并还原到 RGB 空间。
代码实现
作者在论文中已经给出了部分关键代码,因此复现起来很简单。
function im_e = HomoMor (im,Hh,Hl,D0,c)
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
function rgbim = GlobalHomo (I,Hh,Hl,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)
hsiim = rgb2hsi(I);
im = hsiim(:,:,3 );
[row,col] = size (im);
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)
hsiim = rgb2hsi(I);
im = hsiim(:,:,3 );
[row,col] = size (im);
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 = 0 ;
[row,col,channel] = size (I);
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
总结
根据复现结果来看,基本实现了与论文一致的增强效果。但仔细观察发现,其实去除块效应后的图像仍存在一定的边缘突变像素,因为滤波过程中,这些像素的值出现了过度增强,难以通过局部均值进行融合。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步