在之前的学习中我已经知道了图像的分类:物理图像和虚拟图像。
《数字图像处理基础》学习01-数字图像处理的相关基础知识_图像处理 数字-CSDN博客
目录
一,连续图像和离散图像的概念
因为图像的表现方式不同,所以也可以分为:连续图像和离散图像。
连续图像:在二维坐标系上是连续变化的。(即该图像画面的像素点是无限稠密的)。相信学过《数字信号处理》的还记得“模拟信号”这一概念,模拟信号就是连续的,因此模拟信号也称为连续信号。对于连续的信号而言,它所包含的信号就称为模拟信号。在《数字图像处理》中,连续图像所包含的图片,图纸,或景物等原始信息都是连续的模拟信号,因此连续图像也称为模拟图像。
离散图像:使用数字阵列来表示。离散图像也称为数字图像。这种图像所包含的数字信号就是计算机所能处理的。因此,学习数字图像处理的过程中,第一个环节就是将连续图像信息转化为数字形式。即将连续图像的模拟信号转换成离散图像的数字信号,必然会经历采样和量化这两个步骤。
二,图像的采样
采样:将时域或者是空域上的连续图像(或模拟图像)变换成离散采样点(或像素点)集合的一种操作。在采样的过程中需要注意的是,图像是二维信号,基本上是采取二维平面信息的分布方式来描述的。 由于采样一般是对一维信号的采样,因此,需要将二维信号转换成两次一维采样操作实现,一般先进行(xing)行(hang)采样 ,接着再对列采样。对于二维信号,是在二维空间中进行采样,通常是建立一个二维网格来采样。这种方法可以更好地保留信号的空间结构和特征。
行采样:沿垂直方向按一定间隔,从上至下的顺序以直线的方式沿水平方向扫描 。↓ ↓ ↓ ↓ ↓ ↓
通过上面的行采样能够取出各个水平行上的灰度值(灰度值又称为灰阶:表示图像中每个像素的亮度或强度)的一维扫描信息,从而获得图像每行的灰度值阵列,即一组一维的连续信号。
列采样:在行采样的基础上沿水平方向按一定间隔,从左至右的顺序以直线的方式沿垂直方向扫描
一般情况下,水平方向上的采样间隔和垂直方向的采样间隔相同。
经过了行采样和列采样之后,就会得到多个图像元素(像素),即每一个小方格,如下👇
。
对一副图像采样后,若每行(横向)像素有M个,每列(纵向)像素有N个,则图像分辨率(分辨率:采样所获得的图像总像素)为个像素,例如上图中的图像,每行有9个像素,每列有8个像素,因此,该图像的分辨率为个像素。如果想要得到更加清晰的图像质量,就需要提高图像采样的像素点数,同时也会需要更大的存储空间。
接下来学习评价数字图像效果的四个评价参数:
- 图像分辨率:采样所获得的图像总像素。图像分辨率越大,图像越清晰,同时存储量也大。
- 采样密度:图像上单位长度所包含的采样点数。像素间距=采样密度。
- 采样频率:一秒内采样的次数。反映了采样点之间的间隔大小,采样频率越高,丢失的信息越少,采样除的样本越细腻逼真,图像质量越好,同时也如前面提到的,所需要的存储空间也就越大。
- 扫描分辨率:每英寸扫描所得到的点。单位是DPI(dot per inch),一英寸≈2.5cm。扫描分辨率越大,表示被扫描的图像转化为数字化图像越逼真,扫描仪质量也越好。
对于上面的这四个评价参数来说,采样间隔的选取是一个非常重要的问题,它决定了采样后图像的质量,即和原图像相似的程度(或称忠实于原图像的程度),采样间隔的大小取决于原图像中包含的细微亮暗变化。
采样间隔可根据香浓采样定理(或称奈奎斯特采样定理)选取,只要采样频率(或称奈奎斯特率 )高于或等于原始频率的两倍(原始频率一般选取信号最高频率 ,也称为奈奎斯特频率):
即满足关系:
其中:
-
Nyquist 频率 :指的是一个信号的最高频率,它的数值是采样频率的一半。根据奈奎斯特采样定理,为了确保能够无失真地重构一个信号,采样频率必须至少是信号带宽的两倍。因此,对于一个带宽为 B 的信号,Nyquist 频率就是 B。
-
Nyquist 率 :通常是指数字信号处理中的一个术语,用来描述信号采样时所需的最低采样频率。具体而言,Nyquist 率通常是指两倍于最大信号频率的采样频率。
如果采样间隔满足香农定理,图像信息之间不会产生频率混叠,可以完全精确地记录图像信息,则数字图像就可以生动地再现原始场景。
1, 不同采样频率采样同一张图像
如果不知道matlab程序设计中的基础语法的请点击下面的链接并查看相关内容:
Matlab学习04-matlab程序设计中的基础语句-CSDN博客
接下来使用matlab编写代码,并使用不同的采样频率去采样同一张图像,如下👇
【ps:采样间隔越大,图像越模糊,细节信息无法辨认。例如上述的采样频率n=10和n=20】
其中:
- oim存储获取到的原图像(original image),imread是打开并获取具体图像的函数,传入参数为图像在本地计算机中的地址。如果不知道文件路径的添加怎么搞,请点击下面链接并跳转到相关文章去查看:↓ ↓ ↓ ↓ ↓ ↓ ↓《数字图像处理》学习02-BMP位图文件_位图文件大小的计算公式-CSDN博客
-
figure;创建一个用于图像(原图像或处理后的图像)显示的窗口,figure;后面可以直接加上图像显示函数,例如 imshow 函数:
>> help imshow imshow - 显示图像 此 MATLAB 函数 在图窗中显示灰度图像 I。imshow 使用图像数据类型的默认显示范围,并优化图窗、坐标区和图像对象属性以便显示图像。 imshow(I)
如果figure命令后面直接跟着图像显示函数,则一幅图像直接占据一整个图像窗口。如下👇
在数字图像处理中,会有两种图像:原图像和处理后的图像。一般来说,建议将这两种图像都显示在同一个图像窗口中,方便对照并查看处理后的图像的细微变化。
因此,推荐使用subplot函数,在同一个图像窗口中显示多幅图像,该函数可以写在figure窗口函数后面,图像显示函数的前面:>> help subplot subplot - 在平铺位置创建坐标区 此 MATLAB 函数 将当前图窗划分为 m×n 网格,并在 p 指定的位置创建坐标区。MATLAB 按行号对子图位置进行编号。第一个子图是第一行的第一列,第二个子图是第一行的第二列,依此类推。如果指定的位置已存在坐标区,则此命令会将该坐标区设为当前坐标区。 subplot(m,n,p)
例如,现在我需要将4幅图像在同一个图像窗口中显示,并且按照两行两列进行排列:
可以看到这四幅图像的显示的代码编写都一样,唯一不同就是对应的图像序号。因此,可以考虑给个for循环:
为了能够很好的区分每一幅图像,一般都会给图像加上标题title,即在图像显示函数的后面写上title函数:并加上图像的序号组成图像的标题,由于序号是数值型的数据,不能和字符串'图像'直接拼接,这个时候可以使用num2str函数:>> help num2str num2str - 将数字转换为字符数组 此 MATLAB 函数 将数值数组转换为表示数字的字符数组。输出格式取决于原始值的量级。num2str 对使用数值为绘图添加标签和标题非常有用。 s = num2str(A)
该函数将数值型数据转换成字符串类型之后,就可以和字符串进行拼接,如下 ↓:
-
由于是不同的采样间隔,因此,直接定义一个数组类型变量N,存储不同的采样间隔:
N=[1,10,20];
如果要获取其中的元素,只需要使用数组名N (想要获取的元素序号),例如,输出10
-
前面也提到过,图像是二维信号,采样原图像时,原图像的行和列的都需要被采样到,并且在采样的时候一般会选择保留原图像所有的颜色通道,:
sim= oim(1:n:end,1:n:end,:);
其中:
1)sim:sample image采样图像
2)oim:原图像
3)第一个 1:n:end ,表示对原图像的行从第一个像素,采样到最后end一个像素,采样步长为 n(每隔n个像素采样一次)。
4)第一个 1:n:end ,表示对原图像的列从第一个像素,采样到最后end一个像素,采样步长为 n(每隔n个像素采样一次)。
5)最后的冒号,表示保留原图像的所有颜色通道。
这里举个例子,来进一步说明图像的两次一维采样。
oim图像的像素为4x4,现在对其采样,采样步长为2,输出的采样结果sim如下:
代码👇
oim = imread('lena_color_256.tif');
figure;
subplot(2,2,1);
imshow(oim);
title('原图像');
N= [1,10,20];
for i = 1:length(N)
n = N(i);
sim= oim(1:n:end,1:n:end,:);
subplot(2,2,i+1);
imshow(sim);
title(['采样间隔n= ', num2str(n)]);
end
如果有问题请在评论区留言或者是私信我,回复时间不超过一天。