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

news/2024/11/1 3:34:57/

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

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

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

目录

一,量化的相关概念 

matlab%E7%BC%96%E5%86%99%E7%A8%8B%E5%BA%8F%E7%94%9F%E6%88%90%E9%87%8F%E5%8C%96%E5%9B%BE%E5%83%8F-toc" style="margin-left:0px;">二,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%E7%BC%96%E5%86%99%E7%A8%8B%E5%BA%8F%E7%94%9F%E6%88%90%E9%87%8F%E5%8C%96%E5%9B%BE%E5%83%8F">二,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 = 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

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


http://www.ppmy.cn/news/1543475.html

相关文章

【HarmonyOS Next】原生沉浸式界面

背景 在实际项目中&#xff0c;为了软件使用整体色调看起来统一&#xff0c;一般顶部和底部的颜色需要铺满整个手机屏幕。因此&#xff0c;这篇帖子是介绍设置的方法&#xff0c;也是应用沉浸式效果。如下图&#xff1a;底部的绿色延伸到上面的状态栏和下面的导航栏 UI 在鸿蒙…

Flutter Web部署到子路径的打包指令

打包指令&#xff1a; flutter build web --web-renderer canvaskit --base-href /dev110/ --no-tree-shake-icons --dart-defineENVprod参数说明&#xff1a; --web-renderer canvaskit: 使用 canvaskit 渲染模式&#xff0c;可以提高图形和动画的质量。--base-href /dev110…

SpringMvc day1031

ok了家人们今天继续学习SpringMvc&#xff0c;let‘s go&#xff1f; 2.9 静态资源放行 编写类继承于 WebMvcConfigurationSupport &#xff0c;重写 addResourceHandlers 方法&#xff0c;在类上添加 Configuration 注 解。 addResourceHandler映射的地址&#xff0c;/**表…

使用GDAL库的ogr2ogr将GeoJSON数据导入到PostgreSql中

数据下载 数据下载地址&#xff1a;https://datav.aliyun.com/portal/school/atlas/area_selector 我这里下载全国所有城市的数据进行导入 下载安装GDAL 以下是安装 ogr2ogr&#xff08;GDAL 工具集的一部分&#xff09;的步骤&#xff0c;适用于 Windows、macOS 和 Linux 系…

通过secret_id和role_id连接Vault

怎么生成secret_id 和role_id 通过这篇文章可以找到&#xff1a; Jenkins pipeline 怎么连接Vault_jenkinsfile withvault-CSDN博客 当你拥有了secret_id 和role_id&#xff0c;你就可以通过以下代码来进行连接&#xff1a; VaultLoginByApprole(){role_id$1secret_id$2expo…

C语言数据结构学习:单链表

C语言数据结构学习&#xff1a; 汇总入口&#xff1a;C语言数据结构学习&#xff1a;[汇总] 单链表 1. 基础了解 学习之前先了解线性表、顺序表和链表 线性表的两个特点&#xff1a; 有限的序列序列中的每一个元素都有唯一的前驱和后继&#xff0c;除了开头和结尾两个节点 …

「Mac畅玩鸿蒙与硬件8」鸿蒙开发环境配置篇8 - 应用依赖与资源管理

本篇将介绍如何在 HarmonyOS 项目中高效管理资源文件和依赖&#xff0c;以确保代码结构清晰并提升应用性能。资源管理涉及图片、字符串、多语言文件等&#xff0c;通过优化文件加载和依赖管理&#xff0c;可以显著提升项目的加载速度和运行效率。 关键词 资源管理应用依赖优化…

【格言分享】程序员的经典名言解读

上一期文章我们分享了一些程序员的经典名言,每一句都蕴含着深刻的道理。 接下来就给大家一个一个分析一下 这些格言确实捕捉到了编程和软件开发的精髓,每一条都蕴含着丰富的经验和智慧。下面我将逐一解释这些格言,并分享一些我的看法。 C程序员永远不会灭亡。他们只是cast…