《数字图像处理基础》学习04-图像的量化

在上一篇文章中,已经实现了对图像的采样。

《数字图像处理基础》学习03-图像的采样-CSDN博客

接着就需要对图像进行量化操作。 

目录

一,量化的相关概念 

二,matlab编写程序生成量化图像

1,要求

2,思路及注意点

3,效果和代码


虽然经过采样后,模拟图像已经被分解成在时间上和空间上离散的像素(或样本),但这些像素的

取值仍然是连续量(因为每个像素的值是基于连续量(如光强度、颜色值等)计算得来)。

由于像素的取值并不是离散的数值,因此,采样后还需要对图像进行量化操作。

一,量化的相关概念 

量化示意图如下图所示👇。

相关术语的基本概念可以对照着上图来理解: 

  1. 灰度值(或称灰阶),量化值 f_{si}:对连续图像在 [f_{i-1},f_{i}] 区间内的像素值进行量化。

    由于图像灰度值的概率分布密度函数因图像不同而异,所以不能找到一个适用于各种不同图

    像的最佳非等间隔量化方案,因此一般使用的是等间隔量化(又称为均匀量化),与之相对

    的是非等间隔量化(又称为非均匀量化)。
     
  2. 量化误差:真实值 f 与量化值 f_{si}之差,即 f-f_{si}
  3. 灰度等级(或称灰度标度):各个像素的亮暗程度。

量化:把采样点上表示亮暗信息的连续量离散化后,用数值来表示。其中:

  1. 连续量离散化,是指使用指定量化级别的步长让连续量变离散

    1)量化级别:

    ① 是指在量化过程中,连续信号(如图像、音频等)被转换为离散值时所使用的不同离散值

    的数量(简洁点,就是用来表示连续信号不同值的数量)。

    ②量化级别越高,图像的细节和质量通常也会越好,同时需要的存储空间也会越大。和采样类似。

    ③ 在数字图像处理中,量化级别决定了图像的灰度级数或颜色深度。

    ④ 例如,如果一个图像的量化级别为8(即8级量化),则该图像的每个像素可以有8个不同

    等级的灰度值(信号值被映射为0到7,适用于较低精度的图像 或 较低的图像质量)。
     
  2. 用数值表示,是将每个连续值映射到最近的量化级别

    图像的量化等级反映了采样的质量,例如,图像中的每个像素都用8位二进制表示,共有

    2^{8}=256个量级,若采用3位二进制数表示,则有 2^{3}=8 个量级。

    量化过程的例子:

    现在有一个连续的信号(如图像的像素值),其值范围为0到1。现在将其量化为8个级别。

    量化过程如下:

    ①  %计算每个量化级别的步长:步长 = 映射范围 / 量化级别-1

    \frac{1 - 0}{8 - 1}= \frac{1}{7}

    % (之所以量化级别要减一,是因为量化级别从0开始,共7个间隔或区间)

    %通过这种方式计算步长,可以确保在整个范围内均匀地分配量化级别,同时避免在信号值

    %的最小和最大值之间产生不必要的冗余。能够有效地将连续信号转换为离散信号,同时保

    %持尽可能高的精度和质量

    ②  %现在将每个连续值映射到最近的量化级别。例如,值 0.4  被映射到 

    round(0.4 \times 7)=round(2.8)=3

    因此在量化后的图像中,该像素的值为 3

二,matlab编写程序生成量化图像

1,要求

读取一张彩色图片,以采样间隔为1个像素对图像进行采样,要求保留图像的所有颜色通道,之后

分别使用不同的量化级别对采样后的图像进行量化。

2,思路及注意点

采样的部分这里不赘诉。直接到量化的部分。 

  1. 首先,给定量化级别,这里我选择的量化级别分别为128和256,并使用数组变量 nj 存储
    lj=[128,256]; % 数组变量lj 存储不同的量化级别
  2. 根据前面学习的量化公式:

    需要使用到四舍五入函数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

     
  3. 在显示量化图像时,不能直接使用imshow函数显示,需要将量化后的值赋给量化图像的当前

    通道,确保它是unit 8 类型,从而可以用 imsow 函数正常显示。
     
    lh = uint8(lh); % 使用unit8函数之后,可以使用imshow输出图像
    之后还得需要确保量化值在正确范围内,由于unit8函数的主要功能是将量化后的浮点数值转

    换为无符号 8 位整数,共2^{8}=256 个量化级,因此需要设置范围为 \left [ 0,255\right ]
    lh(lh < 0) = 0;   % 当量化值小于0时,将量化值统一设置为0
    lh(lh > 255 =255;  % 当量化值大于255时,将量化值统一设置为255
     之后就可以直接用imshow函数显示量化图像。
     
  4. 如果想要知道图像的分辨率是多少,就可以使用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 = 2;
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(sim,2)),'×',num2str(size(sim,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(lh,2)),'×',num2str(size(lh,1)),'量化图像']);
end

有问题请在评论区留言或者是私信我,回复世界不超过一天。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值