图像处理与Linux编程基础
目录一、BMP图像1. 文件整体结构2. 位图头文件数据结构3. 位图信息数据结构4. 调色板5. 位图数据6. 要点二、JPEG图像1. 文件格式2. 标记定义三、YUV图像1. 文件结构2. 转换公式与要点四、图像缩放五、makefile编写六、Linux多线程编程1. 线程的概念2. POSIX线程3. 几个最基本的库函数4. 编译要点七、信号量八、进程间通信1. 命名管道FIFO命名管道的创建命名管道的访问一、BMP图像1. 文件整体结构典型的BMP图像文件由四部分组成位图头文件数据结构包含BMP图像文件的类型、显示内容等信息位图信息数据结构包含BMP图像的宽、高、压缩方法以及定义颜色等信息调色板可选部分有些位图需要调色板有些位图如真彩色图24位的BMP不需要调色板位图数据根据BMP位图使用的位数不同而不同24位图中直接使用RGB其他小于24位的使用调色板中颜色索引值。2. 位图头文件数据结构共14字节含有BMP文件的类型、文件大小和位图起始位置等信息结构体声明如下typedefstructtagBITMAPFILEHEADER{ushort u16bfType;// 位图文件的类型必须为BM1-2字节uint u32bfSize;// 位图文件的大小以字节为单位3-6字节低位在前ushort u16bfReserved1;// 位图文件保留字必须为07-8字节ushort u16bfReserved2;// 位图文件保留字必须为09-10字节uint u32bfOffBits;// 位图数据的起始位置以相对于位图11-14字节低位在前}__attribute__((packed))BITMAPFILEHEADER;3. 位图信息数据结构共40字节用于说明位图的尺寸等信息结构体声明如下typedefstructtagBITMAPINFOHEADER{uint u32biSize;// 本结构所占用字节数15-18字节uint u32biWidth;// 位图的宽度以像素为单位19-22字节uint u32biHeight;// 位图的高度以像素为单位23-26字节ushort u16biPlanes;// 目标设备的级别必须为127-28字节ushort u16biBitCount;// 每个像素所需的位数必须是1双色、416色、8256色、16高彩色或24真彩色之一29-30字节uint u32biCompression;// 位图压缩类型必须是0不压缩、1BI_RLE8压缩类型或2BI_RLE4压缩类型之一31-34字节uint u32biSizeImage;// 位图的大小以字节为单位其中包含了为了补齐行数是4的倍数而添加的空字节35-38字节uint u32biXPelsPerMeter;// 位图水平分辨率每米像素数39-42字节uint u32biYPelsPerMeter;// 位图垂直分辨率每米像素数43-46字节uint u32biClrUsed;// 位图实际使用的颜色表中的颜色数47-50字节uint u32biClrImportant;// 位图显示过程中重要的颜色数51-54字节}__attribute__((packed))BITMAPINFOHEADER;4. 调色板用于说明位图中的颜色有若干个表项每一个表项是一个RGBQUAD类型的结构定义一种颜色。RGBQUAD结构的定义如下typedefstructtagRGBQUAD{uchar u8rgbBlue;// 蓝色的亮度值范围为0-255uchar u8rgbGreen;// 绿色的亮度值范围为0-255uchar u8rgbRed;// 红色的亮度值范围为0-255uchar u8rgbReserved;// 保留必须为0}__attribute__((packed))RGBQUAD;颜色表中RGBQUAD结构数据的个数由biBitCount来确定当biBitCount1时有2个表项当biBitCount4时有16个表项当biBitCount8时有256个表项当biBitCount24时没有颜色表项位图信息头和颜色表组成位图信息BITMAPINFO结构定义如下typedefstructtagBITMAPINFO{BITMAPINFOHEADER bmiHeader;// 位图信息头RGBQUAD bmiColors[1];// 颜色表}__attribute__((packed))BITMAPINFO;5. 位图数据位图数据记录了位图的每一个像素值记录顺序是在扫描行内是从左到右扫描行之间是从下到上。位图的一个像素值所占的字节数当biBitCount1时8个像素占1个字节当biBitCount4时2个像素占1个字节当biBitCount8时1个像素占1个字节当biBitCount24时1个像素占3个字节按顺序分别为B、G、R结构体声明如下typedefstruct{uchar u8b;uchar u8g;uchar u8r;}RGB;6. 要点由于编译器存在着字节自动对齐的问题声明结构体的时候需要添加__attribute__((packed))让编译器取消自动对齐才会获得正确的大小。使用__attribute__((packed))typedefstructtagBITMAPFILEHEADER{ushort u16bfType;// 位图文件的类型必须为BM1-2字节uint u32bfSize;// 位图文件的大小以字节为单位3-6字节低位在前ushort u16bfReserved1;// 位图文件保留字必须为07-8字节ushort u16bfReserved2;// 位图文件保留字必须为09-10字节uint u32bfOffBits;// 位图数据的起始位置以相对于位图11-14字节低位在前}__attribute__((packed))BITMAPFILEHEADER;// sizeof(BITMAPFILEHEADER) 14不使用__attribute__((packed))typedefstructtagBITMAPFILEHEADER{ushort u16bfType;// 位图文件的类型必须为BM1-2字节uint u32bfSize;// 位图文件的大小以字节为单位3-6字节低位在前ushort u16bfReserved1;// 位图文件保留字必须为07-8字节ushort u16bfReserved2;// 位图文件保留字必须为09-10字节uint u32bfOffBits;// 位图数据的起始位置以相对于位图11-14字节低位在前}BITMAPFILEHEADER;// sizeof(BITMAPFILEHEADER) 16二、JPEG图像1. 文件格式JPEG文件由下面的8个部分组成(1) 图像开始 SOI (Start of Image) 标记标记代码2字节固定值0xFFD8(2) APP0 标记 (Marker)标记代码2字节固定值0xFFE0字段说明APP0长度 (length)2字节①~⑨9个字段的总长度标识符 (identifier)5字节固定值0x4A46494600即字符串JFIF0版本号 (version)2字节一般是0x0102表示JFIF的版本号1.2X和Y的密度单位 (units)1字节0无单位1点数/英寸2点数/厘米X方向像素密度 (X density)2字节Y方向像素密度 (Y density)2字节缩略图水平像素数目 (thumbnail horizontal pixels)1字节缩略图垂直像素数目 (thumbnail vertical pixels)1字节缩略图RGB位图 (thumbnail RGB bitmap)标记段⑨可以包含图像的一个微缩版本存为24位的RGB像素。如果没有微缩图像这种情况更常见则字段⑦和字段⑧的值均为0。(3) APPn 标记 (Markers)其中 n1~15 (任选)标记代码2字节固定值0xFFE1~0xFFEF字段说明APPn长度 (length)2字节①~②2个字段的总长度详细信息 (application specific information)数据长度-2字节内容不定例如Adobe Photoshop生成的JPEG图像中就用了APP1和APP13两个标记段分别存储了一幅图像的副本Exif将数码照片的拍摄参数、缩略图及其他属性信息记录在APP1中。值得注意的是同一APPn标记可以同时出现多个例如用Ps处理过的数码相机拍摄的照片可能会存在2个APP1标记。(4) 一个或者多个量化表 DQT (Define Quantization Table)标记代码2字节固定值0xFFDB最多只能出现4次字段说明量化表长度 (quantization table length)2字节①~③三个字段的总长度量化表号 (quantization table number)1字节量化表 (quantization table)另一种说法为精度及量化表ID1字节高4位精度08位116位低4位量化表ID取值范围为0~3表项64×(精度1)字节例如8位精度的量化表其表项长度为64×(01)64字节查不到更多资料无法分辨哪一种是正确的。(5) 帧图像开始 SOF0 (Start of Frame)标记代码2字节固定值0xFFC0字段说明帧开始长度 (start of frame length)2字节①~⑥六个字段的总长度精度 (precision)1字节每个颜色分量每个像素的位数通常是8位图像高度 (image height)2字节图像高度单位像素如果不支持DNL就必须0图像宽度 (image width)2字节图像宽度单位像素如果不支持DNL就必须0颜色分量数 (number of color components)1字节1灰度图3YCrCb或YIQ4CMYK。JFIF中使用YCrCb故这里颜色分量数恒为3对每个颜色分量 (for each component)颜色分量数×3字节通常为9字节ID1字节水平/垂直采样因子1字节高4位水平采样因子低4位垂直采样因子量化表号 (quantization table#)1字节字段⑥应该重复出现有多少个颜色分量字段⑤就出现多少次一般为3次。(6) 一个或者多个霍夫曼表 DHT (Define Huffman Table)标记代码2字节固定值0xFFC4字段说明霍夫曼表的长度 (Huffman table length)类型、AC或者DC (Type, AC or DC)索引 (Index)位表 (bits table)值表 (value table)DC表和AC表分开编码。另一种说法为表ID和表类型占1字节高4位类型0DC直流1AC交流低4位哈夫曼表ID。由于查不到更多资料无法得出详细含义。(7) 扫描开始 SOS (Start of Scan)标记代码2字节固定值0xFFDA字段说明扫描开始长度 (start of scan length)2字节①~④两个字段的总长度颜色分量数 (number of color components)1字节应该和SOF中的字段⑤的值相同1灰度图3YCrCb或YIQ4CMYK每个颜色分量ID1字节直流/交流系数表号1字节高4位直流分量使用的哈夫曼树编号低4位交流分量使用的哈夫曼树编号压缩图像数据 (compressed image data)谱选择开始1字节固定值0x00谱选择结束1字节固定值0x3F谱选择1字节在基本JPEG中总为00字段③应该重复出现有多少个颜色分量字段②就出现多少次一般为3次。本段结束后紧接着就是真正的图像信息了。图像信息直至遇到一个标记代码就自动结束一般就是以EOI标记表示结束。(8) 图像结束 EOI (End of Image)标记代码2字节固定值0xFFD9其他可能出现的标记段DRI (Define Restart Interval)定义差分编码累计复位的间隔标记代码2字节固定值0xFFDD包含2个具体字段数据长度2字节固定值0x0004①~②两个字段的总长度MCU块的单元中的重新开始间隔2字节设其值为n则表示每n个MCU块就有一个RSTn标记。第一个标记是RST0第二个是RST1等RST7后再从RST0重复如果没有本标记段或间隔值为0时就表示不存在重开始间隔和标记RST。2. 标记定义如果在图像数据流中遇到0xFF应该检测其紧接着的字符0x00表示0xFF是图像流的组成部分需要进行译码0xD0~0xD7组成RSTn标记则忽视整个RSTn标记即不对当前0xFF和紧接的0xDn两个字节进行译码并按RST标记的规则调整译码变量0xFF忽视当前0xFF对后一个0xFF再作判断其他数值忽视当前0xFF并保留紧接的此数值用于译码符号标记代码说明英文解释原文起始帧标记非分层霍夫曼编码Start Of Frame markers, non-hierarchical Huffman codingSOF00xFFC0基线DCTBaseline DCTSOF10xFFC1扩展顺序DCTExtended sequential DCTSOF20xFFC2逐行DCTProgressive DCTSOF30xFFC3空间顺序无损Spatial (sequential) lossless起始帧标记分层霍夫曼编码Start Of Frame markers, hierarchical Huffman codingSOF50xFFC5差分顺序DCTDifferential sequential DCTSOF60xFFC6差分渐进DCTDifferential progressive DCTSOF70xFFC7差分空间无损Differential spatial lossless起始帧标记非分层算术编码

相关新闻

神经网络基础与实战:从原理到Python实现

神经网络基础与实战:从原理到Python实现

1. 神经网络基础概念解析神经网络作为机器学习领域的重要分支,其灵感来源于生物神经系统的结构和功能。简单来说,神经网络是由大量相互连接的节点(或称"神经元")组成的计算系统,这些神经元通过调整连接权重来…

2026/10/16 13:29:09 阅读更多 →
GEO新手最容易踩的“坑”有哪些?

GEO新手最容易踩的“坑”有哪些?

GEO(生成式引擎优化)正成为数字营销领域的热门话题,随着ChatGPT、文心一言等AI大模型深度嵌入搜索引擎和用户信息获取流程,品牌曝光逻辑发生了根本性转变。很多新手满怀热情入局,却因对规则理解不透彻,反复…

2026/10/16 13:55:05 阅读更多 →
战略规划方法论演进:从Excel到AI决策系统

战略规划方法论演进:从Excel到AI决策系统

1. 项目概述:规划方法论十年演进之路 十年前我刚入行做战略规划时,用的还是Excel表格和PPT模板。如今看着团队用智能算法自动生成的可视化路线图,不禁想梳理这十年间规划方法论发生的革命性变化。从最初的手工填表到现在的动态推演系统&#…

2026/10/18 13:16:04 阅读更多 →

最新新闻

AI率过高怎么办?九款降AI率工具与避坑指南

AI率过高怎么办?九款降AI率工具与避坑指南

上个月帮一位在外地项目上常驻的在职朋友看论文。他发来一张截图,检测系统提示“疑似AI生成内容占比接近四成”,导师在批注里连续写了好几遍——这几段请你按自己的话重写。他挺委屈:内容确实是自己对着调研材料一点一点整理出来的&#xff0…

2026/10/19 23:26:19 阅读更多 →
开源代码评审工作流:本地化、可审计、可定制的LLM实践方案

开源代码评审工作流:本地化、可审计、可定制的LLM实践方案

1. 项目概述:这不是一个“工具”,而是一套可落地的开源代码评审工作流“open-code-review”这个名字乍一听像某个新发布的 CLI 工具,或者某家大厂刚开源的 AI 代码审查平台。但实际翻遍 GitHub、Hugging Face 和主流技术社区,你会…

2026/10/19 23:26:19 阅读更多 →
基于YOLO11的无人机检测识别系统设计与实现

基于YOLO11的无人机检测识别系统设计与实现

一提到毕设做深度学习目标检测,十个里有八个都在刷COCO、VOC数据集,真正能落到现实问题上的反而不多。但“空域安全无人机检测识别”这个方向不一样,它直接对准了一个真实且刚需的场景——机场周边、重要场馆、活动安保都需要防范低空慢速小目…

2026/10/19 23:23:08 阅读更多 →
BP-PID残差补偿控制:Simulink中可解释的神经网络增强型PID实现

BP-PID残差补偿控制:Simulink中可解释的神经网络增强型PID实现

简介:本资源是一套基于Simulink实现BP神经网络自整定PID控制器的完整工程实践材料,面向自动化、控制工程及人工智能交叉领域的高校学生、科研人员与工业控制工程师,解决传统PID参数依赖经验整定、适应性差、动态响应不足等实际问题。压缩包共…

2026/10/19 23:18:58 阅读更多 →
STM32 SD卡数据落盘实战:fatfs移植与CSV文件生成

STM32 SD卡数据落盘实战:fatfs移植与CSV文件生成

简介:这份资源面向嵌入式开发学习者与STM32工程师,聚焦在STM32F429平台上集成FatFS文件系统、驱动SD卡写入数据并生成.csv文件,同时结合以太网驱动搭建TCP服务器接收网络数据。内容覆盖FatFS的移植与参数配置、SDIO或SPI方式下的SD卡初始化与…

2026/10/19 23:16:55 阅读更多 →
AI视频生成工作流:从产品拆解到批量成片的完整指南

AI视频生成工作流:从产品拆解到批量成片的完整指南

去年年底接了一个电商代运营团队的活儿,帮他们把带货短视频从“每周人工憋3条”改成“一天批量出20条成片”。项目做完以后,团队里负责剪辑的同事跟我说了一句话,让我印象特别深:以前最怕的不是剪片子,而是想不出脚本、…

2026/10/19 23:05:36 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →