图像增强
增强图像中的有用信息,它可以是一个失真的过程,其目的是要改善图像的视觉效果,因此,图像增强可以不顾增强后的图像是否失真,只要看得舒服就行。
图像增强技术分为:空域处理
和频域处理
,其中空域处理有常见的灰度变换法
、直方图法
、空域滤波
。空域处理常见的有:低通、高通、带阻、同态
等
空域技术
灰度变换增强
首先读取图像获取灰度直方图:
clear; close all;
I=imread('pout.tif');
row=size(I,1);
column=size(I,2);
N=zeros(1, 256);
for i=1:row
for j=1:column
k=I(i, j);
N(k+1)=N(k+1)+1;
end
end
figure;
subplot(121);
imshow(I);
subplot(122);
bar(N);
axis tight;
右图可以知道该图像灰度值主要分布在80~150,将80~150处的灰度值均匀分布在0~255中即:
clear; close all;
I=imread('pout.tif');
row=size(I,1);
column=size(I,2);
N=zeros(1, 256);
for i=1:row
for j=1:column
k=I(i, j);
N(k+1)=N(k+1)+1;
end
end
figure;
subplot(121);
imshow(I);
subplot(122);
bar(N);
axis tight;
得到最终的灰度图以及灰度直方图:
当然可以使用内置的imadjust()
和stretchlim()
imadjust(I,[low_in,high_in],[low_out,hight_out],gamma)
stretchlim(I)
获取最佳区间,即[low_in,high_in]
直方增强
直方图调整法包括直方图均衡化和直方图规定化
直方图均衡化
直方图均衡化是将灰度值分布动态范围偏小的图像(如灰度值集中在直方图右部,此时图像过于明亮)扩大其动态范围,改变后的图像的灰度级数有可能降低:
clear all; close all;
I=imread('tire.tif');
J=histeq(I);
figure;
subplot(121);
imshow(uint8(I));
subplot(122);
imshow(uint8(J));
figure;
subplot(121);
imhist(I, 64);
subplot(122);
imhist(J, 64);
直方图规定化
直方图均衡化能自动增强图像的整体对比度,但是往往结果难以受到控制。实际中常常需要增强某个特定灰度值范围内的对比度或使图像灰度值的分布满足特定需求。这个时候使用直方图规定化会有较好的结果。
clear all; close all;
I=imread('tire.tif');
hgram=ones(1, 256);
J=histeq(I, hgram);
figure;
subplot(121);
imshow(uint8(J));
subplot(122);
imhist(J);
空域滤波
空域滤波是对图像中每个像素为中心的领域进行一系列的运算,然后将得到的结果代替原来的像素值。其中分为线性空域滤波
和非线性空域滤波
,
-
线性滤波
空域滤波常采用
imfilter()
函数和conv2()
函数。imfilter
默认方式为相关滤波
参考博客 -
非线性滤波
-
中值滤波
medfilt2()
,中值滤波可以很好的去除椒盐噪声,平滑效果优于均值滤波,在抑制噪声的同时还可以保持图像的边缘清晰。 -
排序滤波
ordfilt2()
,可选取排序后的某个值作为输出。 -
自适应滤波
wiener()
,可根据图像的局部方差来调整滤波器输出:局部方差大则平滑效果弱;局部方差小则平滑效果强。
拉普拉斯算子锐化滤波
拉普拉斯算子是最简单的各向同性微分算子,具有旋转不变性。一个二维图像函数 的拉普拉斯变换是各向同性的二阶导数,定义为:
为了更适合于数字图像处理,将该方程表示为离散形式:
更多内容如参考参考博客
频域滤波
设为频率点到频域中心的距离,为截止频率,则对于低通的滤波有:
理想低通滤波:
巴特沃斯低通滤波:
高斯低通滤波:
同态滤波
同态变换一般是指将非线性组合信号通过某种变换,使其变成线性组合信号,从而可以更方便的运用线性操作对信号进行处理。
所谓非线性组合信号,举例来说,比如 ,两个信号相乘得到组合信号,由于时域相乘等价于频率域卷积,所以无法在频率域将其分开。但是我们应用一个log算子,对两边取对数,则有: ,这样一来,就变成了线性组合的信号, 和 时域相加,所以频域也是相加的关系,如果它们的频谱位置不同,就可以傅里叶变换后较好的分开,以便进行后续的分别的操作,比如应用高、低通滤波或者其他手工设计的滤波器等,然后再将结果傅里叶反变换,得到处理过的 ,在取幂,就可以得到最终的处理结果。
clear; close all;
I=imread('pout.tif');
J=log(im2double(I)+1);
K=fft2(J);
n=5;
D0=0.1*pi;
rh=0.7;
rl=0.4;
[row, column]=size(J);
for i=1:row
for j=1:column
D1(i,j)=sqrt(i^2+j^2);
H(i,j)=rl+(rh/(1+(D0/D1(i,j))^(2*n)));
end
end
L=K.*H;
M=ifft2(L);
N=exp(M)-1;
figure;
subplot(121);
imshow(I);
subplot(122);
imshow(real(N));