在上一篇文章中,已经实现了对图像的采样。
《数字图像处理基础》学习03-图像的采样-CSDN博客
接着就需要对图像进行量化操作。
目录
一,量化的相关概念
二,matlab编写程序生成量化图像
1,要求
2,思路及注意点
3,效果和代码
虽然经过采样后,模拟图像已经被分解成在时间上和空间上离散的像素(或样本),但这些像素的
取值仍然是连续量(因为每个像素的值是基于连续量(如光强度、颜色值等)计算得来)。
由于像素的取值并不是离散的数值,因此,采样后还需要对图像进行量化操作。
一,量化的相关概念
量化示意图如下图所示👇。
相关术语的基本概念可以对照着上图来理解:
- 灰度值(或称灰阶),量化值 :对连续图像在 区间内的像素值进行量化。
由于图像灰度值的概率分布密度函数因图像不同而异,所以不能找到一个适用于各种不同图
像的最佳非等间隔量化方案,因此一般使用的是等间隔量化(又称为均匀量化),与之相对
的是非等间隔量化(又称为非均匀量化)。
- 量化误差:真实值 与量化值 之差,即 。
- 灰度等级(或称灰度标度):各个像素的亮暗程度。
量化:把采样点上表示亮暗信息的连续量离散化后,用数值来表示。其中:
- 连续量离散化,是指使用指定量化级别的步长让连续量变离散。
1)量化级别:
① 是指在量化过程中,连续信号(如图像、音频等)被转换为离散值时所使用的不同离散值
的数量(简洁点,就是用来表示连续信号不同值的数量)。
②量化级别越高,图像的细节和质量通常也会越好,同时需要的存储空间也会越大。和采样类似。
③ 在数字图像处理中,量化级别决定了图像的灰度级数或颜色深度。
④ 例如,如果一个图像的量化级别为8(即8级量化),则该图像的每个像素可以有8个不同
等级的灰度值(信号值被映射为0到7,适用于较低精度的图像 或 较低的图像质量)。
- 用数值表示,是将每个连续值映射到最近的量化级别。
图像的量化等级反映了采样的质量,例如,图像中的每个像素都用8位二进制表示,共有
个量级,若采用3位二进制数表示,则有 个量级。
量化过程的例子:
现在有一个连续的信号(如图像的像素值),其值范围为0到1。现在将其量化为8个级别。
量化过程如下:
① %计算每个量化级别的步长:步长 = 映射范围 / 量化级别-1
% (之所以量化级别要减一,是因为量化级别从0开始,共7个间隔或区间)
%通过这种方式计算步长,可以确保在整个范围内均匀地分配量化级别,同时避免在信号值
%的最小和最大值之间产生不必要的冗余。能够有效地将连续信号转换为离散信号,同时保
%持尽可能高的精度和质量
② %现在将每个连续值映射到最近的量化级别。例如,值 被映射到
因此在量化后的图像中,该像素的值为 。
二,matlab编写程序生成量化图像
1,要求
读取一张彩色图片,以采样间隔为1个像素对图像进行采样,要求保留图像的所有颜色通道,之后
分别使用不同的量化级别对采样后的图像进行量化。
2,思路及注意点
采样的部分这里不赘诉。直接到量化的部分。
- 首先,给定量化级别,这里我选择的量化级别分别为128和256,并使用数组变量 nj 存储
lj=[128,256]; % 数组变量lj 存储不同的量化级别
- 根据前面学习的量化公式:
需要使用到四舍五入函数round,之后让连续值映射到指定的范围(如果是128级量化,则图
像的连续值乘127,如果是256级量化,则图像的连续值乘255。因此多种不同级的量化,在
同一个表达公式里面的变量值就会不同,可以考虑使用for循环语句,并将round函数写进循
环语句体里面)for i=1:length(lj) % length函数用于获取存储量化等级的数组变量lj的数组长度 lh= round(double(sim)*(lj(i)-1)/255); %变量lh为量化图像的值,sim为采样图像 % 之所以还要再除以255,是因为unit8函数的最大值为255 end
- 在显示量化图像时,不能直接使用imshow函数显示,需要将量化后的值赋给量化图像的当前
通道,确保它是unit 8 类型,从而可以用 imsow 函数正常显示。
之后还得需要确保量化值在正确范围内,由于unit8函数的主要功能是将量化后的浮点数值转lh = uint8(lh); % 使用unit8函数之后,可以使用imshow输出图像
换为无符号 8 位整数,共 个量化级,因此需要设置范围为
之后就可以直接用imshow函数显示量化图像。lh(lh < 0) = 0; % 当量化值小于0时,将量化值统一设置为0 lh(lh > 255 =255; % 当量化值大于255时,将量化值统一设置为255
- 如果想要知道图像的分辨率是多少,就可以使用size函数来获取图像的尺寸:[height, width, numChannels] = size(img) ,其中:
1)height:图像在垂直方向上有height个像素,即图像高。
2)width:图像在水平方向上有width个像素,即图像宽。
3)numChannels:图像颜色通道数,彩色图像有3个颜色(R,G,B)。
如果只想要获取其中一个信息,那么可以使用序号来指定,例如,我只想知道图像的通道
数,则我可以如下编写:
3,效果和代码
oim = imread('lena_color_256.tif');
sp = 1;
sim = oim(1:sp:end, 1:sp:end, :);
figure;
subplot(2, 2, 1);
imshow(oim);
title([num2str(size(oim,2)),'×',num2str(size(oim,1)),'原图像']);
subplot(2, 2, 2);
imshow(sim);
title(['采样间隔为',num2str(sp),'的',num2str(size(oim,2)),'×',num2str(size(oim,1)),'采样图像']);
lj =[128,256];
for i=1:length(lj)
lh= round(double(sim)*(lj(i)-1)/255);
lh = uint8(lh);
lh(lh < 0) = 0;
lh(lh > 255) =255;
subplot(2,2,i+2);
imshow(lh);
title(['量化级别为',num2str(lj(i)),'的',num2str(size(oim,2)),'×',num2str(size(oim,1)),'量化图像']);
end
有问题请在评论区留言或者是私信我,回复世界不超过一天。