概念
本部分多来自课件,见水印
数字图像处理的目的
- 提高图像的视感质量,以达到赏心悦目的目的。
- 提取图像中所包含的某些特征或特殊信息,主要用于计算机分析,经常用作模式识别、计算机视觉的预处理。
- 对图像数据进行变换、编码和压缩,以便用于图像的存储和传输。
数字图像处理的意义
图像处理技术在航空航天、生物医学工程、工业检测、机器人视觉、公安司法、军事、文化艺术等领域得到了广泛的应用,成为一门引人注目、前景远大的新型学科。
用图像处理技术分析飞机遥感和卫星遥感照片,进行森林调查、海洋泥沙调查、渔业调查和水资源调查等资源调查,进行石油勘查、矿产量探测、大型工程地理位置勘探分析等资源勘察,进行土壤营养、水分和农作物生长、产量的估算等农业规划以及进行以地质结构、水源及环境分析等为内容的城市规划。在气象预报和太空其它星球研究方面,数字图像处理技术也发挥了相当大的作用。
在军事方面,图像处理和识别主要用于导弹的精确制导,各种侦察照片的判读,具有图像传输、存储和显示的军事自动化指挥系统,飞机、坦克和军舰模拟训练系统等。在公共安全方面,图像处理技术可用于指纹识别,人脸面部鉴别,不完整图片的复原以及交通监控、事故分析等。目前已投入运行的高速公路不停车自动收费系统中的车辆和车牌的自动识别都是图像处理技术成功应用的例子。
在文化艺术方面,数字图像艺术创作,动画制作,游戏,工艺美术设计,文物资料照片的复制和修复等,均有数字图像处理的成功应用,以至于逐渐形成一门新的学科: 计算机艺术。
相关学科
图像工程是一门系统地研究各种图像理论、技术和应用的交叉学科。从研究方法来看,它与数学、物理学、生理学、心理学、电子学、计算机科学等许多学科可以相互借鉴。从研究范围来看,它与模式识别、计算机视觉、计算机图形学等多个专业又互相交叉。另外,图像工程的研究进展与人工智能、神经网络、遗传算法、模糊逻辑等理论和技术都有密切的联系,它的发展应用与医学、遥感、通信、文档处理和工业自动化等许多领域也是密不可分的。
采样
图像在空间上的离散化称为采样。也就是用空间上部分点的灰度值代表图像,这些点称为采样点。图像是一种二维分布的信息,为了对它进行采样操作,需要先将二维信号变为一维信号,再对一维信号完成采样。具体做法是,先沿垂直方向按一定间隔从上到下顺序地沿水平方向进行直线扫描,取出各水平行上灰度值的一维扫描信号。而后再对一维扫描信号按一定间隔采样得到离散信号。即先沿垂直方向采样,再沿水平方向采样,用两个步骤完成采样操作。对于运动图像(即时间域上的连续图像),需先在时间轴上采样,再沿垂直方向采样,最后再沿水平方向采样三个步骤。
对一幅图像采样时,若每行(即横向)像素为M个,每列(即纵向)像素为N个,则图像大小为M×N个像素。
在进行采样时,采样点间隔的选取是一个非常重要的问题,它决定了采样后图像的质量,即忠实于原图像的程度。采样间隔的大小选取要依据原图像的细微浓淡变化来决定。一般,图像中细节越多,采样间隔应越小。
灰度变换
空间域增强可表示为 g ( x , y ) = T [ f ( x , y ) ] g(x,y)=T[f(x,y)] g(x,y)=T[f(x,y)],其中 f ( x , y ) f(x,y) f(x,y)和 g ( x , y ) g(x,y) g(x,y)分别代表增强前后的图像, T ( ⋅ ) T(·) T(⋅)代表对 f ( x , y ) f(x,y) f(x,y)的增强操作。
若空间域增强是在单个像素上进行的,即输出图像的每个像素值仅由相应的输入图像的像素值决定,则称其为点操作(点处理),或称为灰度变换。
灰度变换就是把原图像的像素灰度经过某个变换函数变换成新的图像灰度。
灰度变换的常见操作有:
- 直接灰度变换法
- 线性、分段线性以及非线性变换
- 直方图修正法
- 直方图均衡化
- 直方图规定化
灰度线性变换
假定原图像 f ( x , y ) f(x,y) f(x,y)的灰度范围为 [ a , b ] [a,b] [a,b],希望变换后图像 g ( x , y ) g(x,y) g(x,y)的灰度范围扩展至 [ c , d ] [c,d] [c,d],则灰度线性变换可表示为
g ( x , y ) = d − c b − a [ f ( x , y ) − a ] + c g(x,y)=\frac{d-c}{b-a}[f(x,y)-a]+c g(x,y)=b−ad−c[f(x,y)−a]+c
直方图均衡化
直方图均衡化的基本思想是把原始图像的直方图变换为均匀分布的形式,从而增加图像灰度的动态范围,达到增强图像对比度的效果。经过均衡化处理的图像,其灰度级出现的概率相同,此时图像的熵最大,图像所包含的信息量最大。
变换后图像的灰度级从黑到白的次序不变,变换前后图像灰度范围一致
更多内容参阅下方“matlab操作基础”部分的有关内容。
图像噪声
图像在获取、存储、处理、传输过程中,会受到电气系统和外界干扰而存在一定程度的噪声。图像噪声使得图像模糊,甚至淹没图像特征,给分析带来困难。噪声可以理解为“妨碍人们感觉器官对所接收的信源信息理解的因素”。噪声也可以理解为不可预测的,只能用概率统计方法来认识的随机误差。噪声可以借用随机过程及其概率密度函数来描述,通常用其数字特征,如均值、方差等。
按照产生原因,图像噪声可分为外部噪声和内部噪声。由外部干扰引起的噪声为外部噪声,如外部电气设备产生的电磁波干扰、天体放电产生的脉冲干扰等。由系统电气设备内部引起的噪声为内部噪声,如内部电路的相互干扰。
按照统计特性,图像噪声可分为平稳噪声和非平稳噪声。统计特性不随时间变化的噪声称为平稳噪声。统计特性随时间变化的噪声称为非平稳噪声。
按噪声和信号之间的关系,图像噪声可分为加性噪声和乘性噪声。假定信号为 S ( t ) S(t) S(t),噪声为 n ( t ) n(t) n(t),如果混合叠加波形是S(t)+n(t)的形式,则称其为加性噪声; 如果叠加波形为 S ( t ) [ 1 + n ( t ) ] S(t)[1+n(t)] S(t)[1+n(t)]的形式,则称其为乘性噪声。加性噪声与信号强度不相关,而乘性噪声则与信号强度有关。为了分析处理方便,往往将乘性噪声近似认为是加性噪声,而且总是假定信号和噪声是互相独立的。
图像噪声一般具有以下特点:
- 噪声在图像中的分布和大小不规则,即具有随机性。
- 噪声与图像之间一般具有相关性。例如,摄像机的信号和噪声相关,黑暗部分噪声大,明亮部分噪声小。又如,数字图像中的量化噪声与图像相位相关,图像内容接近平坦时,量化噪声呈现伪轮廓,但图像中的随机噪声会因为颤噪效应反而使量化噪声变得不很明显。
- 噪声具有叠加性。在串联图像传输系统中,各个串联部件引起的噪声叠加起来,造成信噪比下降。
模板卷积
模板可以是一幅小图像,也可以是一个滤波器,或者说是一个窗口,通常用矩阵来表示。
每个模板都有一个原点,对称模板的原点一般取模板中心点,非对称模板的原点可根据使用目的选取。
模板卷积是数字图像处理中常用的一种邻域运算方式,它是指模板与图像进行类似于卷积或相关(尽管卷积与相关形式上不同,但由于它们之间的相似性,数字图像处理中常认为它们都是卷积)的运算。
模板卷积可实现图像平滑、图像锐化、边缘检测等功能。
模板卷积中的模板又称为卷积核,卷积核中的元素称为卷积系数或模板系数或加权系数,其大小及排列顺序决定了对图像进行邻域处理的类型。
图像平滑
平滑和锐化均属于空间滤波,平滑采用低通滤波器,锐化采用高通滤波器,它们的操作基础都是卷积
中值滤波
中值滤波是一种非线性滤波,它能在滤除噪声的同时很好地保持图像边缘。中值滤波的原理很简单,它把以某像素为中心的小窗口内的所有像素的灰度按从小到大排序,取排序结果的中间值作为该像素的灰度值。
图像锐化
图像模糊的实质就是图像受到平均或积分运算,因而用它的逆运算“微分”,求出信号的变化率,有加强高频分量的作用,可以使图像轮廓清晰。在数字图像处理中,微分运算由差分运算来近似实现。
频率域滤波
频率域滤波的基础是傅里叶变换,见下方“滤波”小节有写。一般有低通滤波器(用于平滑)和高通滤波器(用于锐化)两种,它们的原理是正好相反的。
基于区域的分割(区域生长)
区域生长的基本思想是把具有相似性质的像素集合起来构成区域。首先对每个要分割的区域找出一个种子像素作为生长的起点,然后将种子像素邻域中与种子像素有相同或相似性质的像素合并到种子像素所在的区域中。将这些新像素当作新的种子像素继续上面的过程,直到没有可接受的邻域像素时停止生长。
区域生长法需要选择一组能正确代表所需区域的种子像素,确定在生长过程中的相似性准则,制定让生长停止的条件或准则。相似性准则可以是灰度级、彩色、纹理、梯度等特性。选取的种子像素可以是单个像素,也可以是包含若干个像素的小区域。种子像素的选取一般需要先验知识,若没有则可借助生长准则对每个像素进行相应计算。如果计算结果出现聚类,则接近聚类中心的像素可取为种子像素。生长准则有时还需要考虑像素间的连通性,否则会出现无意义的分割结果。
matlab操作基础
灰度调节imadjust
类似于阻隔和钳制,这种处理对于强调感兴趣灰度区非常有用
Im = imread('1.jpg'); %读入原图
I2=imadjust(Im,[0.2 0.5],[0 1]);%将0.2-0.5之间的灰度扩展到整个0-1范围
噪声imnoise
本小节参阅下方文章
Mathworks - imnoise
图像处理之matlab中imnoise函数用法详解
直方图与直方图均衡化
Matlab中imhist函数的使用及图像直方图的概念
通过直方图均衡化能够自适应地有效改善图像对比度不足问题。
直方图均衡化的原理解释如下:
对于图像的灰度,可以认为是范围 [ 0 , L − 1 ] [0,L-1] [0,L−1]范围内的随机变量,原图像的灰度范围分成若干个区间,每个区间映射为一个值,随着区间越靠近 L − 1 L-1 L−1,映射的值应当越大,映射曲线左到右呈上升阶梯状。划分多少个区间就会产生多少个灰度级。
clear;
Im = imread('3.png'); %读入原图
h=rgb2gray(Im); % 转灰度图
subplot(2,2,1)
imshow(h);
title('原图');
subplot(2,2,2)
imhist(h);
title('原图直方图');
subplot(2,2,3)
j = histeq(h,128); % 直方图均衡化,灰度级是128,默认是n=64
imshow(j);
title('直方图均衡化后的图');
subplot(2,2,4)
imhist(j);
title('均衡化后的直方图');
再看看其他灰度级的:
滤波
低通(平滑)滤波器:通过(平均值)模糊图像来平滑图像,最明显的应用是降噪
高通(锐化)滤波器:通过导数来锐化图像,突出灰度中的过渡
零填充→产生暗色边框伪影
中值滤波器
中值滤波器是一种常用的非线性滤波器,其基本原理是选择待处理像素的一个邻域中各像素值的中值来代替待处理的像素,其主要功能是像素的灰度值与周围像素比较接近,从而消除孤立的噪声点,所以中值滤波器能够很好的消除椒盐噪声。不仅如此,中值滤波器在消除噪声的同时,还能有效的保护图像的边界信息,不会对图像造成很大的模糊(相比于均值滤波器)。(本段内容出处:知乎 - 四种图像滤波算法实现及原理解析)
MATLAB–数字图像处理 中值滤波
中值滤波有两种方法,一种是使用库函数medfilt2
,一种是自己写,可参阅上文
clear;
Im = imread('3.png'); %读入原图
h=rgb2gray(Im);
subplot(1,3,1)
imshow(h);
title('原图');
subplot(1,3,2);
J = imnoise(h,'salt & pepper',0.1);
imshow(J);
title('添加噪声后');
subplot(1,3,3)
imshow(medfilt2(J,[2,2]));
title('中值滤波');
前置知识:傅里叶变换
傅里叶变换在频域滤波领域的用途是,将图像的数据从空间域转换到频率域,在频率域对图像进行处理,处理后再将图像进行傅立叶反变换转换到空间域。
属于频率域滤波的有:
- 使用低通滤波器的滤波
- 使用高通滤波器的滤波
- 选择性滤波
你需要了解的 Matlab 相关函数包括(超链接的是官方文档):
- fftshift:将零频分量移到频谱中心
- fft2:二维快速傅里叶变换
低通滤波器
在以原点为中心、以D 0 D_0D0为半径的圆内,无衰减地通过所有频率,而在该圆外“切断”所有频率的二位低通滤波器,称为理想低通滤波器(ILPF)
clear;
Im = imread('3.png'); %读入原图
h=rgb2gray(Im);
subplot(2,2,1)
J = imnoise(h,'gaussian'); % 将方差为 0.01 的零均值高斯白噪声添加到灰度图像h
imshow(J); % 显示最初的噪声图
title('原噪声图');
subplot(2,2,2);
s = fftshift(fft2(J)); % 傅里叶变换将图像从空间域变换到频率域
imshow(log(abs(s)),[]);
title('原图频率域');
subplot(2,2,3)
% 低通滤波部分关键代码
[a,b] = size(h); % 获取图像大小
a0 = round(a/2); % 获取频率域图像的中心,便于下面计算distance
b0 = round(b/2);
d0=40; % 设置截止频率是40
for i =1:a
for j = 1:b
distance = sqrt((i-a0)^2 + (j-b0)^2);
if distance<d0
h = 1;
else
h = 0;
end
result(i,j) = h*s(i,j);
end
end
new_img = uint8(real(ifft2(ifftshift(result))));
imshow(new_img,[]);
title('低通滤波后');
subplot(2,2,4);
imshow(log(abs(result)),[]);
title('滤波后频率域');
循环里的h
就像给图像加一个遮罩,为1就代表s保留,为0就代表s的内容不保留,遮罩完的频率域图像就是result
变量所保存的。
高通滤波器
高通滤波器正好是很低通滤波器相反,由于结论是是显而易见的,故只把核心代码放在下面
% 高通滤波部分关键代码
[a,b] = size(h); % 获取图像大小
a0 = round(a/2); % 获取频率域图像的中心,便于下面计算distance
b0 = round(b/2);
d0=40; % 设置截止频率是40
for i =1:a
for j = 1:b
distance = sqrt((i-a0)^2 + (j-b0)^2);
if distance<d0
h = 0;
else
h = 1;
end
result(i,j) = h*s(i,j);
end
end
new_img = uint8(real(ifft2(ifftshift(result))));
其实就是把if
语句里的0和1换了下位置。