灰度变换在图像的单个像素上操作,主要以对比度和阈值处理为目的
空间滤波涉及改善性能的操作(邻域操作),如通过图像中每一个像素的邻域处理来锐化图像
这两种方法均属于图像增强。
灰度变换
- 邻域基本增强变换
- 定义
- 数学表达
- 三种基本灰度变换技术
- 例子
- 图像反转
- 对数变换
- 幂律(伽马)变换
- 对比度拉伸
邻域基本增强变换
定义
邻域为1×1: Basic intensity transformation
邻域n×n: 基于空间滤波的增强
整幅图像的统计特性: 基于直方图的增强
数学表达
g
(
x
,
y
)
=
T
[
f
(
x
,
y
)
]
g(x,y)=T[f(x,y)]
g(x,y)=T[f(x,y)]
s
=
T
[
r
]
s=T[r]
s=T[r]
r
:
r:
r:原图像
f
(
x
,
y
)
f(x,y)
f(x,y)在
(
x
,
y
)
(x,y)
(x,y)处的灰度值
s
:
s:
s:增强图像
g
(
x
,
y
)
g(x,y)
g(x,y)在
(
x
,
y
)
(x,y)
(x,y)处的灰度值
三种基本灰度变换技术
- 线性: 正比, 反比
- 对数: 对数, 反对数
- 幂次: n次幂, n次方根
例子
图像反转
I = imread('lena.jpg');
subplot(1,4,1);imshow(I);xlabel('原图');
I_gray = rgb2gray(I);
subplot(1,4,2); imshow(I_gray);xlabel('灰度图');
I_reverse2 = 255 - I_gray;
% I_reverse2 = imcomplement(I);
subplot(1,4,3); imshow(I_reverse2);xlabel('灰度反转');
I_reverse3 = imcomplement(I);
subplot(1,4,4); imshow(I_reverse3);xlabel('颜色反转');
对数变换
表达式: s = l o g ( 1 + r ) s=log(1+r) s=log(1+r)
把窄范围的低灰度级映射到宽范围的灰度级 (增强低灰度级)
把宽范围的高灰度级映射到低范围的灰度级 (抑制高灰度级)
clear;
img = imread('lena.jpg');
f=rgb2gray(img); %对于RGB图像必须做的一步,也可以用im2double函数
g = im2uint8(mat2gray(log(1 + double(f)))); % 使用对数变换
ff2=fftshift(fft2(f));
subplot(131),imshow(ff2,[]);title('原始图像');
subplot(132),imshow(log(abs(ff2)+1),[]);title('对数变换');
subplot(133),imshow(g,[]);title('对图像对数变换');
代码中可能会遇到的问题:
参考博客Matlab傅里叶变换实例
1、关于imshow函数:
使用imshow函数显示图像时要注意图像矩阵类型,当图像是double类型时要使用imshow(I,[ ])来根据数据矩阵的数值范围自动设置灰度图像显示范围。
2、关于运行时可能出现的警告:
如果图像进行傅里叶转换后立即用imshow函数显示,则在命令行可能会显示:Warning: Displaying real part of complex input(警告: 显示复数输入项的实部)。这是因为经过傅里叶变换后的图像矩阵大多是复数矩阵,包含实部和虚部。此时如要显示图像则需要先用abs取复数矩阵的模,再进行显示。
取模后图像矩阵的数值一般会很大,直接用imshow函数是无法显示的,此时可以用log函数取其对数
3、关于开头im2double和rgb2gray函数的使用:
对于RGB真彩图像来说,读入后是以三维矩阵形式存储的,如果此时直接进行傅里叶变换,则频谱图会显示为一片空白或者是密密麻麻的。所以在对RGB图像进行傅里叶变换前要进行类型转换,可以使用im2double将其转换为双精度型,或者使用rgb2gray将其转换为灰度图像。
使用不同的函数其变换效果也是不一样的。如使用im2double,进行傅里叶变换后其频谱图呈白色基调,使用rgb2gray其频谱图呈灰色基调。
幂律(伽马)变换
表达式:
s
=
c
r
γ
s=cr^{\gamma}
s=crγ
γ
\gamma
γ<1: 扩展暗像素值, 压缩亮像素值
γ
\gamma
γ>1: 压缩暗像素值, 扩展亮像素值
应用: 用于各种图像获取、打印和显示等设备的伽马校正(Gamma correction)
%扩展亮灰度级
clear;
img = imread('Fig0308(a)(fractured_spine).tif');
f=mat2gray(img);
a=1;
gamma=0.6;
gamma1=0.3;
s=a*(f.^gamma);
s1=a*(f.^gamma1);
s2=log(1+f);
subplot(221),imshow(f,[0 1]);title('原始图像');
subplot(222),imshow(s,[0 1]);title('0.6');
subplot(223),imshow(s1,[0 1]);title('0.3');
subplot(224),imshow(s2,[0 1]);title('对数变换');
可以看到当
γ
=
0.6
\gamma =0.6
γ=0.6到0.3后,出现轻微苍白外观,对比度开始下降。
%压缩图像亮度
clear;
img = imread('Fig0309(a)(washed_out_aerial_image).tif');
f=mat2gray(img);
a=1;
gamma=3;
gamma1=4;
s=a*(f.^gamma);
s1=a*(f.^gamma1);
s2=log(1+f);
subplot(221),imshow(f,[0 1]);title('原始图像');
subplot(222),imshow(s,[0 1]);title('\gamma =3');
subplot(223),imshow(s1,[0 1]);title('\gamma =4');
subplot(224),imshow(s2,[0 1]);title('对数变换');
可以看到当 γ > 1 \gamma >1 γ>1时,可实现灰度级压缩。
对比度拉伸
提高图像灰度级的动态范围
clear all;clc;
%分段线性灰度变换
f=imread('Fig0310(b)(washed_out_pollen_image).tif');
% f=rgb2gray(img); %将彩色图像数据R转换为灰度图像数据J
a=max(max(f));
b=min(min(f));
[m,n]=size(f); %获得灰度图像J的行列数M,N
H=zeros(m,n);
for x=1:m
for y=1:n
if (f(x,y)<=110); %对灰度图像J进行分段处理,处理后的结果返回给矩阵H
H(x,y)=b;
else
H(x,y)=a;
end
end
end
figure,
subplot(121),imshow(f,[]);
subplot(122),imshow(H,[]);