当前位置: 首页 > news >正文

《数字图像处理基础》学习02-BMP位图文件

目录

一,BMP文件组成 

二,使用ultra edit软件查看图像结构

1,ultra edit软件的下载和安装 

2,ultra edit打开图像 

 三,使用matlab显示RGB图像


 

 在之前的文章学习到,计算机只能处理数字图像,因此,这篇文章我接着学习数字图像的位图文件结构。

一,BMP文件组成 

 BMP文件由四部分组成:

  1. 位图文件头

    所存的内容如下:
    typedef struct tagBITMAPFILEHEADER
    {WORD bfType; // 字节 'BM'DWORD bfSize; // 文件大小,表示文件的总字节数WORD bfReserved; // 保留字,一般设为标准值0WORD bfReserved; // 保留字,一般设为标准值0DWORD bfOffBits;// 位图数据的起始位置(位图数据距文件头的偏移量)
    }BITMAPFILEHEADER;
                         
  2. 位图信息头

     
    typedef struct tagBITMAPINFOHEADER
    {DWORD biSize; // 本结构大小的字节数 LONG biWidth; // 图像的宽,单位为像素点 LONG biHeight;// 图像的高,单位为像素点WORD biPlanes; // 位平面数,一般设为标准值1即可 WORD biBitCount;// 每个像素所需的位数,单色位图一个像素占一位,灰度图和伪彩色图8位,真彩色24位 DWORD biCompression; // 位图压缩类型,对于bmp来说,一般不压缩,设为标准值0DWORD biSizeImage; // 位图大小,以字节为单位 LONG biXPelsPerMeter; // 指定目标设备的水平分辨率。设为标准值0 LONG biYPelsPerMeter;// 指定目标设备的垂直分辨率。设为标准值0 DWORD biClrUsed; //颜色数。设为标准值0 DWORD biClrImportant;// 重要的颜色数。设为标准值0
    }BITMAPINFOHEADER;

     
  3. 调色板
     
    typedef struct tagRGBQUAD
    {BYTE rgbBlue; // 蓝色 BYTE rgbGreen; // 绿色 BYTE rgbRed;  // 红色 BYTE rgbReserved;  // 保留的字节,设为标准值0 
    }RGBQUAD;
  4. 位图数据
     
    typedef struct tagBITMAPINFO
    {BITMAPINFOHEEADER bmiHeader;RGBQUAD bmicolors[1]; // 颜色表 
    }BITMAPINFO;

    如果有颜色表的话,数据值就是颜色表的索引号。

小知识:word类型占2个字节,dword(double word)类型占4个字节,long类型占4个字节。 

之所以要了解BMP文件的组成结构,不仅是因为在软件开发上,要用这几个变量存储位图数据,而且也是为了能够分析图像的数据。

接下来就开始分析图像的数据。 

位图文件常见的格式有:

  1. jpeg(或 jpg):全称 joint photographic experts group  联合图像专家组
  2. gif:全称 graphics interchange format  图像互换格式



    可以看到,gif 格式常用于表情包、视频截取。
  3. bmp:全称 bit map  位图 
  4. tiff:全称 tag image format file  标签图像文件格式

二,使用ultra edit软件查看图像结构

 在处理图像时,或多或少会用到一个软件:ultra edit。因为ultra  edit 软件可以将打开的文件所对应的ASCII码输出,很大程度上有助于分析图像的数据。 软件下载及安装如下↓

1,ultra edit软件的下载和安装 

对应软件到夸克网盘链接下载:https://pan.quark.cn/s/de62f2f5b1f6

下载之后是个压缩包,

将压缩文件剪切到空间比较大的磁盘(或者是解压到习惯将软件下载的盘符下)并创建一个有“ultra edit”这两个关键字的文件夹名,之后在创建的文件夹里面解压压缩包。

 之后两步走:

  1. 运行exe可执行文件,没什么注意的,就是软件的安装路径需要需改,以及最后不要勾选任何选项。
  2. 之后,使用管理员身份运行bat文件,如果显示如下信息:
    The customized UE directory is F:\APP\UE_27_x64\The environment is initialized !已复制         1 个文件。*********************** Step A rps_UE has been done ! ************************Item A has been added !Item B has been added !*********************** Step B has been done ! ***********************IP1 has been added!IP2 has been added!IP3 has been added!IP4 has been added!IP5 has been added!Strategy has been applied !*********************** Step C has been done ! ***********************----------------------- 注册环境成功!请按任意键退出!------------------------

    则表示ultra edit软件安装成功。接着打开ultra edit软件并打开图像查看图像数据信息👇

2,ultra edit打开图像 

 之后就会输出如下信息 (图像文件的数据分布情况)↓ 

可以看到,包含内容的图像文件数据很多,因此,建议用画笔软件新建一张只有一个像素的24位位图(一个像素的位图用ultra edit软件打开只看到文件头部分),打开画笔软件👉

接着鼠标左键点击“文件”→选择“属性”,如右图所示

 在弹出的界面里面修改宽和高,都设置为1,表示图像的大小只有1×1。

修改之后保存成24位位图的格式 

 最后再用ultra edit软件打开只有一个像素的24位位图,显示的数据如下

结合之前的位图文件头结构:

  1. 前两个字节是字节‘BM’,
  2. 后四个字节是整个文件大小,
  3. 接着后四个字节是保留字,
  4. 最后四个字节是偏移量

 

其中需要注意的有两个地方:

  1. 3A 00 00 00:这四个字节是整个文件(或数据区)的大小,由于是从低位到高位排列(低位在前,高位在后),因此需要将“3A 00 00 00”倒过来写,变成“00 00 00 3A ”
  2. 36 00 00 00:位图数据距文件头的偏移量,和文件大小一样,也是从低位到高位排列(低位在前,高位在后),因此需要将“36 00 00 00”倒过来写,变成“00 00 00 36 ”​​​​​​。

之后的40个字节就是BITMAPINFOHEADER的结构:

 三,使用matlab显示RGB图像

 如果没有下载matlab软件,请点击如下链接去下载

matlab软件下载安装及修改项目工作目录_matlab解压密码用于所有压缩文件中-CSDN博客

需要注意的是,读取的图像要放置在代码文件对应的目录下,例如,我的代码文件text1.m所使用的编辑器的工作路径在“D:\myMatlab”下,因此,将图像复制或者是剪切到“D:\myMatlab”目录下:

 更方便的方法是添加图像文件夹到编辑器的搜索路径中  ↓

 如上操作之后,即使图像和代码文件不在同一个文件夹,编辑器也可以搜索到图像文件。

% 清空工作区
clear ;
clc; 
close all;
t=imread("lena_color_256.tif");
g=im2gray(t);
set(0,"defaultFigureColor",[0 1 1]);
set(0,"defaultFigurePosition",[100,100,1000,500]);
subplot(121);imshow(t);
subplot(122);imshow(g);

 代码注解:

clear ; %清空工作空间的变量
clc;    %清屏
close all;  % 关闭当前所有图形窗口
t=imread("lena_color_256.tif"); %imread函数读取图像
g=im2gray(t);  %im2gray函数将rgb图像转换成灰度图像
set(0,"defaultFigureColor",[0 1 1]);  %图形窗口的背景颜色(青色)
set(0,"defaultFigurePosition",[100,100,1000,500]); % 图形窗口的位置和大小
subplot(121);imshow(t); % subplot函数用于显示多个图形窗口:121表示总共有一行两列,该图形窗口显示在第一列
%imshow函数显示图像,显示的是读取的rgb图像

其中:

set(0,"defaultFigureColor",[0 1 1]);  %图形窗口的背景颜色(青色)

图形窗口的背景颜色可以有8个组合 ↓  (将表中的255替换成1就是图形窗口的背景色) 

                                                  

                                                      8位伪彩色的颜色索引表

 我的记忆方法是利用谐音法:

  1. 三原色:rgb,红绿蓝,谐音,红绿灯。
  2. 从红色开始:红黄紫白,谐音,红花纸白。
  3. 蓝色:就只有G值有255值。
  4. 从绿色开始:绿青,谐音,滤清。

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

相关文章:

《数字图像处理基础》学习02-BMP位图文件

目录 一,BMP文件组成 二,使用ultra edit软件查看图像结构 1,ultra edit软件的下载和安装 2,ultra edit打开图像 三,使用matlab显示RGB图像 在之前的文章学习到,计算机只能处理数字图像,因…...

车辆管理系统设计与SpringBoot技术融合

3系统分析 3.1可行性分析 通过对本车辆管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本车辆管理系统采用Spring Boot框架,JAVA作为开发语…...

常见TCP/IP协议基础——计算机网络

目录 前言常见协议基础常见协议-基于TCP的应用层协议常见协议-基于UDP的应用层协议常见协议-网络层协议习题自测1.邮件发送协议2.接收邮件协议端口3.建立连接4.层次对应关系5.FTP服务器端口 前言 本笔记为备考软件设计师时的重点知识点笔记,关于常见TCP/IP协议基础…...

SVM支持向量机python实现

支持向量机(Support Vector Machine, SVM)是一种强大的监督学习算法,主要用于分类和回归任务。SVM的核心思想是找到一个最优的超平面,使得不同类别的数据点能够被尽可能清晰地分开,并且这个超平面与最近的数据点之间有…...

linux查看系统类型

要确定系统是 Ubuntu 还是 CentOS,可以通过查看系统的发行版信息来判断。以下是几种常见的方法: 方法一:使用 cat 命令查看 /etc/os-release 文件 这个文件包含了系统的详细信息,包括发行版名称和版本号。 cat /etc/os-release…...

SpringSecurity 捕获自定义JWT过滤器抛出的异常

自定义过滤器如下: /*** jwt过滤器,验证令牌是否合法** author 朱铭健*/ Slf4j public class JwtAuthenticationFilter extends OncePerRequestFilter {Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse resp…...

中小型企业网络的设计与实现

资料下载中小型企业网络的设计与实现论文资源-CSDN文库 摘 要 本文规划的是一个公司的网络搭建,网络设计包括了多个部门的网络架构,每个部门通过VLAN进行隔离,确保了网络的安全性和高效。 华为企业网络模拟平台(ENSP&#xff09…...

小马识途海外媒体推广有何优势?

互联网让地球变得像一个村子一样,信息可以瞬间变得人尽皆知,商品和服务也同样习惯了跨国合作。中国不少物美价廉的产品在世界各地都很受欢迎,国内小资群体对国外的服饰和美妆更是偏爱有加。小马识途营销顾问认为,中国品牌不出走国…...

Spring Boot知识管理:跨平台集成方案

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…...

逆向工程基本流程

1 逆向的基本流程 1获取目标app (官网,豌豆荚),尽量不要去华为应用市场,小米应用市场下载–多渠道打包,安装到手机上 2使用抓包工具 抓包分析(charles,fiddler…) 3使用反编译工具 (JADX,JD-GUI。。),把apk反编译成java代码,分析java代码,定位代码位置 4 使用动态分…...

target_include_directories是如何组织头文件的?

target_include_directories(mylib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) 这条 CMake 命令用于指定编译目标(在此例中为 mylib 静态库)的头文件搜索路径。具体来说,这条命令的作用包括以下几个方面: 1. 添加包含目录 mylib&…...

【Flutter】Dart:运算符

在 Dart 中,运算符是非常重要的组成部分,它们可以对变量和常量进行多种运算操作。理解和掌握 Dart 中的各种运算符不仅可以帮助你编写更加高效、简洁的代码,还能更好地理解其背后的逻辑和设计。本文将深入探讨 Dart 中的运算符,包…...

ChatGPT01-preivew体验报告:内置思维链和多个llm组合出的COT有啥区别呢?丹田与练气+中学生物理奥赛题测试,名不虚传还是名副其实?

一个月前,o1发布的时候,我写了篇文章介绍 逻辑推理能力堪比博士生,OpenAI发布全新AI模型系列: o1 - 大模型或许进入新阶段,还翻译了官方的介绍 解密OpenAI o1是如何让LLMs获得逻辑推理能力的 - CoT * RL,也…...

《云计算网络技术与应用》实训6-1:配置KVM虚拟机使用NAT网络

任务1、计算节点基础环境准备 1. 使用VMware安装CentOS 7虚拟机,安装时记得开启CPU虚拟化,命名为“KVMC6”。 2. (网卡配置和之前的一样,都用100网段)网关设置为192.168.100.1,地址段为192.168.100.10-25…...

【Unity新闻】Unity 6 正式版发布

Unity CEO Matt Bromberg 在今天自豪地宣布,Unity 6 正式发布!作为迄今为止最强大和稳定的版本,Unity 6 为游戏和应用开发者提供了大量的新功能和工具,帮助他们加速开发并提升性能。 本次正式版是6.0000.0.23f1(LTS&a…...

基于语音识别的停车共享小程序(lw+演示+源码+运行)

目 录 1 绪论1 1.1 课题研究背景1 1.2 研究现状1 1.3 论文结构安排1 2 系统关键技术2 2.1 微信小程序2 2.2 微信Web开发者工具2 2.3 JavaScript简介2 2.4 微信小程序API接口2 2.5 MYSQL数据库2 3 系统分析1 3.1 可行性分析1 3.1.1 技术可行性1 3.1.2 经济可行性1…...

编程考古-计算机发展(上)

计算机/器现在是我们日常生活中的重要工具,它的发展历程见证了人类数学计算能力的不断提升。 什么是计算 计算的本质在于基于规则对符号串进行变换。简言之,从一个初始的符号串(输入)出发,依据既定的法则逐步改变这个…...

pc轨迹回放制作

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:pc轨迹回放制作 主要内容:制作车辆轨迹操作页,包括查询条件、动态轨迹回放、车辆轨迹详情表单等 应用场景:车辆…...

无向图中的一些问题与处理(上接无向图知识简记)

一、有向图中的排序与调度 1、深度优先搜索的排序 使用深度优先搜索对图中顶点进行排序,根据数据结构性质与递归保存顺序,有以下三种排列顺序 (1) 前序:在递归调用之前将顶点加入队列。 (2)后…...

AIGC助力小学生编程梦:C++入门不再难!

文章目录 一、AIGC时代下的编程教育新趋势二、小学生C入门趣味编程的意义三、小学生C入门趣味编程的实践策略四、面临的挑战与应对策略五、AIGC技术在小学生C编程中的应用与前景《小学生C趣味编程从入门到精通》编辑推荐内容简介作者简介目录 随着人工智能生成内容(…...

AI开发-三方库-Hugging Face-Pipelines

1 需求 需求1:pipeline支持的任务类型 需求2:推理加速使用CPU还是GPU 需求3:基于pipeline的文本分类示例 需求4:pipeline实现原理 模型使用步骤(Raw text -》Input IDs -》Logits -》Predictions)&…...

【Python网络编程】学习Socket编程,打造网络应用!

【Python网络编程】学习Socket编程,打造网络应用! 网络编程是现代计算机科学中的重要一环,几乎所有的应用都依赖网络传输数据。无论是创建简单的客户端-服务器模型,还是构建复杂的网络应用,Socket 编程都是关键的技术…...

docker (desktopcompose) download

docker docker-compose download 百度网盘获取离线包链接release-notes 参考dockerdocker-composewlspowershell...

即时通讯:单聊消息逻辑

在线消息(对方在线) 1.client发送消息到msg_server 2.msg_server判断消息有效性,每秒发送的消息不能超过限制,无误后转发给db_server 3.db_server判断为单聊 查找对应的会话,不存在则创建两个会话(双方…...

Libevent源码剖析之reactor

1 简介 reactor 是一种事件驱动的并发处理模式,常用于网络服务器和事件循环系统中。它主要的功能是通过单线程或者多线程处理I/O操作,避免阻塞,并且能够高效处理大量并发的事件。 one loop per thread or process,以下摘自 reacto…...

分享一套SpringBoot+Vue民宿(预约)系统

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue民宿(预约)系统,分享下嘿嘿。 项目介绍 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难&#xff0c…...

Linux——应用软件的生命周期

功能开发测试: 功能性测试 对应开发框架的测试用例代码的漏洞扫描 Web服务器版本应用开发语言的依赖关系和版本信息是否会造成类似内存泄露等影响系统性能的问题压力测试应用的部署 获取应用代码以及应用静态文件的代码包将安装包中的文件按照服务器配置的架构&…...

【Linux】exec系列函数详细介绍

首先,exec 是 execute (意为:执行) 的缩写。 exec系列函数 各个“后缀”的意思: l 为 list 可变参数列表、v 为 vector、p 为 PATH、e 为环境变量数组 envp execl:l 为 list 可变参数列表 原型:int execl(const char *path, cons…...

ARINC 429总线协议

一、概述 ARINC 是美国航空无线电公司英文字头的缩写, 该公司1977年7月21日出版了“ARINC 429规范”一书,429规范就是飞机电子系统之间数字式数据传输的标准格式,在飞机上使用429总线的电子设备均应遵守这个规范,这样才能保证电子…...

Qt解决槽函数中发送的信号的参数会变化带来的错误

connect(item, &MusicItemWidget::playRequest, this, [this] { emit playMusic(QUrl(this->m_mediaPath); ); 如上图,this->m_mediaPath是个成员变量,但自己的初衷是发送一个最开始捕获的值,那么可以使用下面的方法…...