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

news2024/11/24 9:16:48

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

《数字图像处理基础》学习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 = 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.coloradmin.cn/o/2229806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

逻辑代数的基本公式

根据图中的逻辑运算符号&#xff0c;包括与非逻辑&#xff08;NAND&#xff09;、或非逻辑&#xff08;NOR&#xff09;、与或非逻辑、异或逻辑&#xff08;XOR&#xff09;和同或逻辑&#xff08;XNOR&#xff09;&#xff0c;我们可以分别给出每个运算符的真值表。 1. 与非逻…

iptables面试题

1、详述iptales工作流程以及规则过滤顺序&#xff1f; iptables过滤的规则顺序是由上至下&#xff0c;若出现相同的匹配规则则遵循由上至下的顺序 2、iptables的几个表以及每个表对应链的作用&#xff1f; Iptables有四表五链 Filter表 : Filter表是iptables中使用的默认表…

Java Collection/Executor DelayedWorkQueue 总结

前言 相关系列 《Java & Collection & 目录》《Java & Executor & 目录》《Java & Collection/Executor & DelayedWorkQueue & 源码》《Java & Collection/Executor & DelayedWorkQueue & 总结》《Java & Collection/Executor &a…

[Python学习日记-59] 开发基础练习2——网站访问日志分析

[Python学习日记-59] 开发基础练习2——网站访问日志分析 简介 题目 答案 简介 该练习结合了函数和一些常用的模块开发了一个对网站访问日志分析的程序&#xff0c;可以巩固实践之前学习的内容。 题目 基本需求&#xff1a; 统计本日志文件的总 pv、uv 数列出全天每小时的…

tiktok批量添加达人怎么弄

在 TikTok 上批量添加达人可以借助一些工具或方法&#xff0c;以下是一些常见的途径&#xff1a; 点我达秘免费体验地址注册 使用达人邀约工具&#xff1a; 功能特点&#xff1a;这类工具专为 TikTok 跨境小店和本土小店提供服务&#xff0c;可以实现多国家、多店铺同时私信和…

深度学习-激活函数详解

激活函数在神经网络中的作用是引入非线性特征&#xff0c;使得网络可以拟合和表达更复杂的数据关系。它通过对输入进行非线性变换&#xff0c;让每一层的输出既能反映输入特征&#xff0c;又能传递重要信息&#xff0c;以进行梯度更新。以下是关于常用激活函数的详细讲解。 1.…

基于vue框架的的乐守护儿童成长记录系统b65tg(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,成长指标,疫苗接种,学业档案,课外活动,旅游经历,交流论坛 开题报告内容 基于Vue框架的乐守护儿童成长记录系统开题报告 一、研究背景与意义 随着科技的飞速发展和家庭对子女成长关注度的不断提升&#xff0c;如何科学、系统地记…

使用wordcloud与jieba库制作词云图

目录 一、WordCloud库 例子&#xff1a; 结果&#xff1a; 二、Jieba库 两个基本方法 jieba.cut() jieba.cut_for_serch() 关键字提取&#xff1a; jieba.analyse包 extract_tags() 一、WordCloud库 词云图&#xff0c;以视觉效果提现关键词&#xff0c;可以过滤文本…

安卓13 连接usb设备后不更新ui

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码更改4.彩蛋1.前言 有些界面在链接usb设备后,ui会被刷新,导致闪烁问题。 2.问题分析 像这种问题一般是usb事件,导致的ui事件更新了,处理方法是禁止该事件 3.代码更改 这块我们就需要在输入事件管理里面…

根号下-1等于多少

根号下的负数在实数范围内是没有定义的&#xff0c;但在复数范围内&#xff0c;我们可以用虚数单位 来表示。具体来说&#xff1a; 因此&#xff0c;根号下的负一等于虚数单位 。

什么是人工智能(AI)?

人工智能AI&#xff08;即Artificial Intelligence&#xff09;是计算机科学的一个分支&#xff0c;旨在让计算机模仿人类的决策能力、像人类一样思考和行动&#xff0c;来解决如自然语言处理、推荐、智能数据检索、预测等方面人类无法处理或难以处理的复杂工作。 为什么需要人…

国标GB28181公网直播EasyGBS国标GB28181软件的应用场景

随着科技的飞速发展&#xff0c;安防视频监控技术已经成为现代社会不可或缺的一部分&#xff0c;它在保障公共安全、企业运营安全以及个人财产安全方面发挥着举足轻重的作用。国标GB28181网页直播平台EasyGBS安防视频监控平台&#xff0c;作为集高效性、稳定性与智能化于一体的…

[java][基础]JSP

目标&#xff1a; 理解 JSP 及 JSP 原理 能在 JSP中使用 EL表达式 和 JSTL标签 理解 MVC模式 和 三层架构 能完成品牌数据的增删改查功能 1&#xff0c;JSP 概述 JSP&#xff08;全称&#xff1a;Java Server Pages&#xff09;&#xff1a;Java 服务端页面。是一种动态的…

Bacnet+springboot部署到linux后,无法检测到网络中的其他设备

场景描述 springbootbacnet4j项目完成后&#xff0c;在window环境可以正常检测到其他设备&#xff0c;但是部署到linux环境之后&#xff0c;无法获取。 解决办法 首先bacnet的子网掩码要设置为&#xff1a;255.255.255.0 确保linux服务器的防火墙允许 255.255.255.255 广播。…

HarmonyOS 5.0应用开发——音频播放组件的封装

【高心星出品】 文章目录 音频播放组件的封装开发步骤封装类代码测试代码 音频播放组件的封装 鸿蒙中提供了AVPlayer来实现音频播放的功能&#xff0c;播放的全流程包含&#xff1a;创建AVPlayer&#xff0c;设置播放资源&#xff0c;设置播放参数&#xff08;音量/倍速/焦点模…

深度探索C++对象模型

文章目录 前言一、关于对象C对象模型 二、构造函数实例分析 拷贝构造函数程序转化语意学(Program Transformation Semantics)成员初始化列表 三、数据语义学(The Semantics of Data)数据存取多种继承情况讨论仅单一继承加上虚函数多重继承虚拟继承 Pointer to Data Members 四、…

TLV320AIC3104IRHBR 数据手册 一款低功耗立体声音频编解码器 立体声耳机放大器芯片麦克风

TLV320AIC3104 是一款低功耗立体声音频编解码器&#xff0c;具有立体声耳机放大器以及在单端或全差分配置下可编程的多个输入和输出。该器件包括基于寄存器的全面电源控制&#xff0c;可实现立体声 48kHz DAC 回放&#xff0c;在 3.3V 模拟电源电压下的功耗低至 14mW&#xff0…

【Rust中的序列化:Serde(一)】

Rust中的序列化&#xff1a;Serde Serde是什么&#xff1f;什么是序列化序列化&#xff1f;Serde运行机制Serde Data ModelVistor ApiSerializer ApiDeserializer Api 具体示例流程分析具体步骤&#xff1a;那么依次这个结论是如何得出的呢?什么是de? 总结 Serde是什么&#…

普通的Java程序员,需要深究源码吗?

作为Java开发者&#xff0c;面试肯定被问过多线程。对于它&#xff0c;大多数好兄弟面试前都是看看八股文背背面试题以为就OK了&#xff1b;殊不知现在的面试官都是针对一个点往深了问&#xff0c;你要是不懂其中原理&#xff0c;面试就挂了。可能你知道什么是进程什么是线程&a…

【vue项目中添加告警音频提示音】

一、前提&#xff1a; 由于浏览器限制不能自动触发音频文件播放&#xff0c;所以实现此类功能时&#xff0c;需要添加触发事件&#xff0c;举例如下&#xff1a; 1、页面添加打开告警声音开关按钮 2、首次进入页面时添加交互弹窗提示&#xff1a;是否允许播放音频 以上两种方…