CCF-GESP计算机学会等级考试2023年6月四级C++T2图像压缩算法解析与实现

【2306 GESP 4级 T2】图像压缩(题解) 压缩规则为:统计出每种灰阶的数量,取数量最多的前 16 种灰阶(如某种灰阶的数量与另外一种灰阶的数量相同,则以灰阶 值从小到大为序),分别编号 0-F(最多的编号为 0,以此类推)。灰阶‘AB’、‘CF’和‘FF’出现 14 次,‘00’出现 10 次,‘CB’出现 9 次,‘09’出现 7 次,‘AC’出现 6 次,‘07’出现 5 次,‘10’、‘11’ 和‘98’出现 4 次,‘01’、‘1B’、‘67’、‘76’和‘FC’出现 3 次。这样的像素组成的图像,称为 256 级灰阶的灰度图像。 阅读详情

1. 从“看图说话”到“图像压缩”:这道题到底想考你什么?

如果你正准备参加CCF-GESP的四级考试,看到“图像压缩”这个题目,心里可能会“咯噔”一下。图像处理?听起来好高级,是不是要学什么复杂的算法?别慌,我刚开始接触这类题目时也这么想。但实际做下来,我发现这道题的精髓其实不在于让你去发明一个全新的压缩算法,而在于考察你能否将一个现实生活中的问题,用扎实的编程基本功清晰、准确地模拟出来。说白了,就是“阅读理解 + 模拟实现”。

题目描述了一大堆关于256级灰阶、16级灰阶、统计数量、找最近似值……听起来很复杂,对吧?我们换个方式来理解。想象一下,你有一盒非常丰富的彩色铅笔,有256种不同的灰色(从纯黑到纯白)。现在,你的朋友只有一盒16色的灰色铅笔,但他想临摹你的画。他该怎么办呢?他首先会观察你的画,找出你最常用的那16种灰色,作为他的“核心色盘”。然后,对于你画中那些不属于这16种的灰色,他就用自己色盘里最接近的颜色来涂。这道题要你做的,就是把这个过程用程序自动化。

所以,它本质上考的是这几项能力:对字符串和十六进制数据的处理、数组的灵活运用、自定义排序规则,以及遍历查找的逻辑。这些都是C++四级要求掌握的核心技能。题目把“图像”这个外壳包装上去,是为了增加场景感,但内核依然是基础数据操作。理解了这一点,你就不会被吓倒,可以安心地一步步拆解问题了。接下来,我们就像侦探破案一样,把题目的每一个要求都掰开揉碎,看看代码到底该怎么写。

2. 庖丁解牛:一步步拆解题目逻辑与核心算法

面对一个复杂问题,最好的办法就是分步骤解决。我们先把官方的问题描述翻译成更直白的“操作指南”。

2.1 第一步:理解数据输入与存储

题目输入的不是一张图片文件,而是用十六进制字符串表示的图像数据。每一行字符串代表图像的一行像素,每两个字符表示一个像素的灰度值(00到FF,即十进制的0到255)。例如,“00FFCFAB”就表示四个像素,灰度值分别是0, 255, 207, 171。

我们的第一个任务就是把这些字符串“翻译”成程序能方便计算的整数。这里有一个小坑:字符‘A’到‘F’代表十进制的10到15。我们需要写一个辅助函数来完成这个转换。我常用的方法是:如果字符在‘0’到‘9’之间,就减去‘0’;如果在‘A’到‘F’之间,就减去‘A’再加10。这样就能得到单个十六进制位对应的十进制值。然后,将连续两个字符的值组合起来:高位 * 16 + 低位,就得到了0-255之间的完整灰度值。

存储方面,我们需要两个核心数据结构:

  1. 二维数组 a[25][25]:用来存放转换后的整张图像数据。题目说最多20行,每行最多20个像素,所以开25*25的数组足够用了,下标从1开始会更符合我们的思维习惯,避免一些边界错误。
  2. 统计数组 his[256]:这是一个长度为256的整数数组,下标直接对应灰度值(0到255)。his[100]就表示灰度值为100的像素在图像中出现了多少次。初始化时所有值都为0,然后在读取数据的过程中进行累加。

2.2 第二步:选出“明星色盘”——统计与排序

这是整个算法的第一个关键点。我们需要从所有出现过的灰度值中,选出出现次数最多的16个,作为压缩后的“核心色盘”。

怎么选呢?最直观的想法是:对his[256]这个统计数组进行排序。但是,直接排序会丢失灰度值与其出现次数的对应关系。因此,我们需要把(出现次数, 灰度值)这个组合作为一个整体来操作。这里有两种常见的编程思路:

  • 思路A:使用结构体数组。定义一个结构体node,包含两个成员:灰度值hd和数量sl。创建一个大小为256的node数组c,遍历his数组,将每个灰度值i和其出现次数his[i]赋值给c[i]。然后,对这个结构体数组进行排序
【GESP真题解析】第 5 集 GESP 四级 2023 年 6 月编程题 2:图像压缩 GESP C++ 四级 2023 年 6 月 编程题第二题:图像压缩 解析 阅读详情

相关推荐

图像压缩(2023 gesp 4 洛谷 B3851)

[GESP202306 四级] 图像压缩## 题目描述图像是由很多的像素点组成的。如果用 $0$ 表示黑,$255$ 表示白,$0$ 和 $255$ 之间的值代表不同程度的灰色,则可以用一个字节表达一个像素(取值范围为十进制 `0-255`、十六进制 `00-FF`)。这样的像素组成的图像,称为 $256$ 级灰阶的灰度图像。现在希望将 $256$ 级灰阶的灰度图像压缩为 $16$ 级灰阶,即每个像素的取值范围为十进制 `0-15`、十六进制 `0-F`。

2301_78518688的博客 810

图像压缩(GESP4级第二次认证编程题)题解

图像压缩(GESP4级第二次认证编程题)题解

三轴云台稳定控制算法优化实战:从PID到模糊自适应

本文深入探讨了三轴云台稳定控制算法的优化实践,从经典PID控制到模糊自适应算法的进阶应用。通过实战案例和代码示例,详细解析了PID调参技巧、模糊控制实现及多传感器数据融合方法,帮助工程师在复杂环境下提升云台抗干扰能力和响应速度,特别适用于无人机航拍等场景。

green的博客 908

Android 音频源码分析——AudioTrack设备选择

Android 音频源码分析——AndroidRecord录音(一) Android 音频源码分析——AndroidRecord录音(二) Android 音频源码分析——AndroidRecord音频数据传输流程 Android 音频源码分析——audioserver启动 Android 音频源码分析——AudioFlinger Android 音频源码分析——AudioTrack设备选择 基于Andorid9.0源码 以AudioTrack为例,梳理下输出设备选择流程。 音频设备选择的影响因素: Au

奋斗的菜鸟ing 3970

Jetson Orin Nano - SONY imx415 camera驱动开发

基于英伟达 Jetson orin nano 平台 imx415 camera驱动开发

hinewcc的博客 3240

正点原子RK3588 Android 12镜像构建实战:从环境配置到烧录验证全指南

本文提供了一份基于正点原子RK3588开发板的Android 12镜像构建全流程实战指南。内容涵盖从Ubuntu环境配置、SDK获取、编译内核与系统,到最终镜像打包与烧录验证的完整步骤,并分享了内核驱动定制与系统优化技巧,旨在帮助开发者高效完成瑞芯微RK3588平台的系统定制工作。

grass的博客 807

用STM32F103C8T6和TB6612驱动模块,从零搭建一辆能避障循迹的智能小车(附完整代码)

本文详细介绍了如何使用STM32F103C8T6和TB6612驱动模块从零搭建一辆能避障循迹的智能小车。内容涵盖硬件选型、电路设计、底层驱动配置以及智能行为算法实现,并附有完整代码示例,帮助开发者快速掌握嵌入式开发的核心技术。

weixin_42641741的博客 444

Camera(5)metadata

Metadata 是整个 Android camera 中类似于高楼大厦中的管道系统一样,贯穿了整个 Camera 的 Framework 和 vendor HAL。Metadata 里面包含了所有的控制、参数、返回值等等。Metadata分为Android原生的Metadata和芯片商或者用户自定义的Metadata,即Android Tag和Vendor Tag。Vendor Tag在Hal中定义,并在camx和chi目录中使用。

qq_55893245的博客 3049

Qt实现YOLO目标检测及其界面制作(附完整源码)

Qt实现YOLO目标检测及其界面制作(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 2737

Autosar诊断实战系列05-Dcm之0x27加解密服务配置开发详解

UDS 0x27服务实战开发介绍,对解锁尝试次数及delay时间进一步解释。

initiallizer的博客 1991

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: Wireshark实战解析:深入探究DHCP协议的四步交互过程
下一篇: Windows 环境下 Nacos 的快速部署与高效配置指南
php55
博客等级 码龄15年 51粉丝 1553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值