二值化图片数据解码显示(Grayscale8、Grayscale16、RGB888)————附带Qt版完整代码
文章目录
- 1 效果
- 2 思路
- 3 实现代码
- 4 扩展
- 4.1 RGB888
- 4.2 Grayscale16
- 5 实验数据
1 效果
显示效果:
二值化后的图片数据:
原始数据信息:
\x00\x1F\x8F\xFF\xFF\xFF\xFF\xFF\xE0\x00\x01\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF0\x00\x0F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF0\x00?\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF0\x00?\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\x0F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF8\x1F\xFF\xFF\xFF\xFF\xFC\x01\xFF\xFF\xFF\x1F\xFF\xFF\xFF\xFF\xE0\x00?\xFF\xFF\x07\xFF\xFF\xFF\xFF\x00\xF8\x0F\xFF\xFF\x07\xFF\xFF\xFF\xFE\x0E\x03\x83\xFF\xFF\x03\xFF\xFF\xFF\xF8 \x00"“a\xFF\xFF\x01\xFF\xFF\xFF\xF0\xC0\x00\x18\xFF\xFF\x00\xFF\xFF\xFF\xE1\x07\x8F\f\x7F\xFF\x00?\xFF\xFF\xC6\r\x9F\x06?\xFF\x00\x7F\xFF\xFF\xCC\x19\x99\x81\x1F\xFF\x01\xFF\xFF\xFF\x88\f\x91\x00\x8F\xFE\x03\xFF\xFF\xFF\x11\xCC\x93\x10\x8F\xFF\x0F\xFF\xFF\xFF#\xC0\x02>G\xFF?\xFF\xFF\xFE”`\xE0"“fG\xFF?\xFF\xFF\xFEG\x02\f\x06#\xBF?\xFF\xFF\xFE”"C\x88\x02\f#\xFF\x7F\xFF\xFF\xFC@\x11\xC1\x18"“3\xFF\xFF\xFF\xFF\xFC\x80\x03\xC8\x00\x13\xFF\x07\xFF\xFF\xFC\x8E \f\x80\x11\xFF\x07\xFF\xFF\xFC\x98\fL\x9F\x11\xFF\x03\xFF\xFF\xFC\x90\f\xE0\x83\x11\xFF\x00\x7F\xFF\xFC\x98\f\xE0\x81\x91\xFF\x00?\xFF\xFC\x8E\bL\x81\x91\xFF\x00?\xFF\xFC\x80 \f\x0F\x11\xFF\x00\x7F\xFF\xFC\x80\x03\x98\x00\x11\xFF\x00\x7F\xFF\xFC\x83\x11\x80\x00\x03\xFF\x00\xFF\xFF\xFC”"F\b\x00"“0\x03\xFF\x00\xFF\xFF\xFE”“D@\x00\x1C\x03\xFF\x00\xFF\xFF\xFE”"D\xC0@\x8C\x07\xFF\x01\xFF\xFF\xFE’\x80\x00\xCC\x07\xFF\x01\xFF\xFF\xFF\x00\x10\x00x\x07\xFF\x0F\xFF\xFF\xFF\x10""0&\x00\x0F\xFC\x04\x7F\xFF\xFF\x88"“2&\x00\x0F\xFC\xFF\xFF\xFF\xFF\xC4\x12”\x00\x1F\xFE\xFF\xFF\xFF\xFF\xC2\x1C<\x00?\xFF\xFF\xFF\xFF\xFF\xE1\x00\x00\x00\x7F\xFF\xFF\xFF\xFF\xFF\xF0@\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xF8\x00\x00\x01\xFF\xFF\xFF\xFF\xFF\xFF\xFE\x01\xF0\x03\xFF\xFF\xFF\xFF\x80\xFF\xFF\x00\x00\x0F\xFF\xFF\xFF\xC0\x0F\xFF\xFF\xE0\x00?\xFF\xFF\xF8\x01\x7F\xF1\xFF\xFC\x03\xFF\xFF\xFF\x00?\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\x07\xFF\xFE\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xF8\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x00\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFE\x00\x00\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xF8\x00\x00\x7F\xFF\xFF\xFF\xFF\xE0\xFF\xF0\x00\x00\x7F\xFF\xFF\xFF\xFC\x00\xFF\x80\x00\x00?\xFF\xFF\xFF\xC0\x00\xFE\x00\x00\x00?\xFF\xFF\xF8\x00\x00\xF8\x00\x00\x00?\xFF\xFF\x00\x00\x00\xC0\x00\x00\x00\x1F\xFF\xF0\x00\x00\x00\x80\x00\x00\x00\x1F\xFE\x00\x00\x00\x00
转换为16进制后显示的图片数据信息:
00 1F 8F FF FF FF FF FF E0 00 01 FF FF FF FF FF FF FF F0 00 0F FF FF FF FF FF FF FF F0 00 3F FF FF FF FF FF FF FF F0 00 3F FF FF FF FF FF FF FF FF 7F 0F FF FF FF FF FF FF FF FF F8 1F FF FF FF FF FC 01 FF FF FF 1F FF FF FF FF E0 00 3F FF FF 07 FF FF FF FF 00 F8 0F FF FF 07 FF FF FF FE 0E 03 83 FF FF 03 FF FF FF F8 20 00 61 FF FF 01 FF FF FF F0 C0 00 18 FF FF 00 FF FF FF E1 07 8F 0C 7F FF 00 3F FF FF C6 0D 9F 06 3F FF 00 7F FF FF CC 19 99 81 1F FF 01 FF FF FF 88 0C 91 00 8F FE 03 FF FF FF 11 CC 93 10 8F FF 0F FF FF FF 23 C0 02 3E 47 FF 3F FF FF FE 22 60 E0 66 47 FF 3F FF FF FE 47 02 0C 06 23 BF 3F FF FF FE 43 88 02 0C 23 FF 7F FF FF FC 40 11 C1 18 33 FF FF FF FF FC 80 03 C8 00 13 FF 07 FF FF FC 8E 20 0C 80 11 FF 07 FF FF FC 98 0C 4C 9F 11 FF 03 FF FF FC 90 0C E0 83 11 FF 00 7F FF FC 98 0C E0 81 91 FF 00 3F FF FC 8E 08 4C 81 91 FF 00 3F FF FC 80 20 0C 0F 11 FF 00 7F FF FC 80 03 98 00 11 FF 00 7F FF FC 83 11 80 00 03 FF 00 FF FF FC 46 08 00 30 03 FF 00 FF FF FE 44 40 00 1C 03 FF 00 FF FF FE 44 C0 40 8C 07 FF 01 FF FF FE 27 80 00 CC 07 FF 01 FF FF FF 00 10 00 78 07 FF 0F FF FF FF 10 30 26 00 0F FC 04 7F FF FF 88 32 26 00 0F FC FF FF FF FF C4 12 22 00 1F FE FF FF FF FF C2 1C 3C 00 3F FF FF FF FF FF E1 00 00 00 7F FF FF FF FF FF F0 40 00 00 FF FF FF FF FF FF F8 00 00 01 FF FF FF FF FF FF FE 01 F0 03 FF FF FF FF 80 FF FF 00 00 0F FF FF FF C0 0F FF FF E0 00 3F FF FF F8 01 7F F1 FF FC 03 FF FF FF 00 3F FF 00 FF FF FF FF FF FF 07 FF FE 00 FF FF FF FF FF FF FF FF F8 00 FF FF FF FF FF FF FF FF E0 00 FF FF FF FF FF FF FF FF 80 00 7F FF FF FF FF FF FF FE 00 00 7F FF FF FF FF FF FF F8 00 00 7F FF FF FF FF E0 FF F0 00 00 7F FF FF FF FC 00 FF 80 00 00 3F FF FF FF C0 00 FE 00 00 00 3F FF FF F8 00 00 F8 00 00 00 3F FF FF 00 00 00 C0 00 00 00 1F FF F0 00 00 00 80 00 00 00 1F FE 00 00 00 00
2 思路
二值化后的图片数据为:每像素占1bite(1位)。
为了显示,我们需要把图片信息还原为软件可以显示的格式,比如我现在还原的格式就是QImage::Format_Grayscale8
,即每像素占8位的格式。
背景:二值化的图片信息是每像素占一位。0代表黑,1代表白。
方法:
- 1 根据图片数据的信息,图片占600的字节,即4800位,因此创建一个一维的容量为4800无符号数组,
- 2 读取图片每位的像素信息,
- 3 从低位到高位与1进行与操作(使用逻辑移位>>)
- 如果是1,则无符号数组中填充0xFF,两个十六进制数(即8位),即把1位每像素还原为8位每像素;
- 如果是0,则无符号数组中填充0x00;
- 填充的方法为:
- 法1:根据宽、高分别为80和60,每一行数据代表一个宽,行数代表高,每一行满80(宽的个数==80),则换下一行(即高个数加1),在数组的位置标示为:宽长度(80)* 高个数 + 宽个数【用一位数组标示二维数组】
- 法2:0到4800依次填充
- 4 根据图片的格式显示图片
3 实现代码
读取数据
//读数据到bufferQFile file("/Users/macbookpro/Documents/test9.txt");QByteArray imgData;if(file.open(QIODevice::ReadOnly)){//只读、二进制方式imgData = file.readAll();file.close();} //转换为无符号数组unsigned char* tempImgContent = reinterpret_cast<unsigned char*>(imgData.data());int width = 80;int height = 60;unsigned char *binarydata = new unsigned char[width * height];// 每字节8位
法二:
int pixCnt = 0;for(int i = 0; i < 600;i++){for(int j = 7; j >=0;j--){if(((tempImgContent[i]>>(j)) & 0x01) == 1){binarydata[pixCnt++] = 0xFF;//白(两个4位/一个16进制,共8位)}else{binarydata[pixCnt++] = 0x00;//黑}}}QImage imageData(binarydata, 80, 60, QImage::Format_Grayscale8);
法一:
int widthCnt = 0, heightCnt = 0;for(int i = 0; i < 600;i++){for(int j = 7; j >=0;j--){if(((tempImgContent[i]>>(j)) & 0x01) == 1){binarydata[heightCnt * 80 + widthCnt] = 0xFF;//白(两个4位/一个16进制,4位)widthCnt++;if(widthCnt == 80){heightCnt++;widthCnt = 0;}}else{binarydata[heightCnt * 80 + widthCnt] = 0x00;//黑widthCnt++;if(widthCnt == 80){heightCnt++;widthCnt = 0;}}}}QImage imageData(binarydata, 80, 60, QImage::Format_Grayscale8);
4 扩展
4.1 RGB888
把二值化的图片数据转位24位每像素格式图片(即RGB每8位一像素)显示
思路:
- 1 创建一个二维数组[高][宽];
- 2 读取图片数据,给二维数组的每个元素赋值,与1进行与操作,相同取1,不同取0;
- 3,根据宽、高、数据格式(QImage::Format_RGB888),使用构造函数创建QImage对象,
- 4, 设置每个像素的值,如果是0,则赋予QColor(0,0,0),否则赋予QColor(255,255,255),同时赋予位置。
- 5,调用QPixmap显示图片。
实现代码:
读取数据:
//读数据到bufferQFile file("/Users/macbookpro/Documents/test9.txt");QByteArray imgData;if(file.open(QIODevice::ReadOnly)){//只读、二进制方式imgData = file.readAll();file.close();}
```cpp
存储到二维无符号数组
unsigned char *msrc = tempImgContent;unsigned char tmpsrc;unsigned char pix[60][80];//创建二维数组 高和宽for (int i = 0;i < 60; i++) {for(int j = 0; j < 80; j += 8) {tmpsrc = *msrc++;pix[i][j+0] = (tmpsrc >> 7) & 0x01;//与1进行与操作,相同取1,不同取0pix[i][j+1] = (tmpsrc >> 6) & 0x01;pix[i][j+2] = (tmpsrc >> 5) & 0x01;pix[i][j+3] = (tmpsrc >> 4) & 0x01;pix[i][j+4] = (tmpsrc >> 3) & 0x01;pix[i][j+5] = (tmpsrc >> 2) & 0x01;pix[i][j+6] = (tmpsrc >> 1) & 0x01;pix[i][j+7] = (tmpsrc >> 0) & 0x01;}}
根据图片格式绘制图片:
int nWidth = 80, nHeight = 60;QImage imageData(nWidth, nHeight, QImage::Format_RGB888);for (int x = 0;x < 60;x++) {for (int y = 0;y < 80;y++) {if(pix[x][y] == 0){//宽高,rgb三色imageData.setPixel(y, x, QColor(0, 0, 0).rgb());}else{imageData.setPixel(y, x, QColor(255, 255, 255).rgb());}}}
显示图片:
QPixmap resImage = QPixmap::fromImage(imageData);resImage.scaled(ui->imageLabel->size(), Qt::IgnoreAspectRatio);//图片缩放到和label一样大小,并且改变图片比列ui->imageLabel->setScaledContents(true);//label可变属性ui->imageLabel->setPixmap(resImage);
4.2 Grayscale16
把二值化的图片转换为 QImage::Format_Grayscale16格式(16位每像素)
int widthCnt = 0, heightCnt = 0;for(int i = 0; i < 600;i++){for(int j = 7; j >=0;j--){if(((tempImgContent[i]>>(j)) & 0x01) == 1){binarydata[heightCnt * 160 + widthCnt*2] = 0xFF;//白(两个4位/一个16进制,8位)binarydata[heightCnt * 160 + widthCnt*2+1] = 0xFF;//白(两个4位/一个16进制,8位)widthCnt++;if(widthCnt == 160){heightCnt++;widthCnt = 0;}}else{binarydata[heightCnt * 160 + widthCnt*2] = 0x00;//黑binarydata[heightCnt * 160 + widthCnt*2+1] = 0x00;//黑(两个4位/一个16进制,8位)widthCnt++;if(widthCnt == 160){heightCnt++;widthCnt = 0;}}}}QImage imageData(binarydata, 80, 60, QImage::Format_Grayscale16);
5 实验数据
链接:https://pan.baidu.com/s/1-ZfxiXacSiLCOcxlcBilWw 密码:aqm6
二值化图片数据解码显示(Grayscale8、Grayscale16、RGB888)————附带Qt版完整代码相关推荐
- Matlab批量二值化图片保存及基本操作
1.批量二值化及保存 clc; clear; file_path = 'E:\spyder\spineunet-1\data\train\image\';% 图像文件夹路径 img_path_list ...
- 还在纠结通道数、位深度?实验带你看懂关于灰度图像,二值化图像,彩色图像、图片通道数,位深度的全部内容
数据加载相关 前言 图片的通道数.位深度 单通道 三通道 四通道 通道数之间的转化 二值化图像 小结 灰度图像 小结 pillow库 相关全部代码 前言 首先我们都知道,图像是由一个个像素点组成的.图 ...
- python 图像二值化
自适应二值化,高斯加权二值化: image =cv2.imread(r'E:\data\barcode\test\1009_11\test\blur\509915979678918664.jpg', ...
- OTSU_图像二值化分割阈值的算法
简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...
- matlab 图像二值化 后0、1像素的个数统计
目标: 批量处理RGB图像,对其进行二值化处理(需要考虑二值化的阈值设置,此处不展开) 统计二值化之后,各个黑白图像中0.1 的像素点数目 使用折线图的方式,展示出统计的结果 首先进行输入文件夹 与输 ...
- java入门之 美图相机(原图、灰度、二值化、马赛克、融合、轮廓获取)
编写美图相机时,我们首先需要了解图片再计算机中的存储形式,详情可见http://t.csdn.cn/MgOfO 目录 <1>创建显示图片的主界面 1.添加窗体,用数列添加按钮,设置窗体可视 ...
- OV2640灰度处理和软件二值化
图像灰度化 1.分量法 2.最大值法 3.平均法 4.加权平衡法 计算灰度值流程 1.设置OV2640输出的数据为YUV422格式(16位数据的高字节为Y亮度值) void OV2640_YUV422 ...
- OpenCV二值化cvThreshold和自适应二值化cvAdaptiveThreshold及Otsu
阈值化函数: double cvThreshold(constCvArr* src, CvArr* dst, double threshold, double max_value,int thresh ...
- opencv 车牌识别---新能源车牌处理(二值化后按位取反)
场景: 在对车牌号进行识别时,不能识别出新能源车牌的车牌号. 问题原因: 因为我们的识别模板都是黑底白字,新能源的车牌进行二值化处理后都是白地黑字. 模板: 新能源车牌原图(部分): 新能源车牌二 ...
最新文章
- 敏捷冲刺每日报告四(Java-Team)
- linux-glibc内存管理小结2(内存相关系统调用的实现)
- 代码神器:拒绝重复编码,这款IDEA插件了解一下.....
- 旷视科技 Face++ 全资收购艾瑞思机器人 正式进军机器人业务
- win7 将文件的背景色改为绿色
- 皮一皮:年轻人真会玩...
- Python《爬虫收集》
- 数据结构之队列的应用(实现斐波那契数列)
- 【VB】StrConv函数.
- 用Java来写常见的排序算法
- Oracle开发实战经典教程(教学视频)
- RX8010/RX-8025T测试说明
- 企业微信和钉钉的区别以及企业微信的功能
- python 拆分excel单元格_如何用Python拆分合并后的Excel单元格?
- C# 30分钟完成百度人脸识别——进阶篇(文末附源码)
- 显示器颜色偏色的排查过程(偏黄、偏红、偏蓝、偏绿等)
- 2022极米投影和米家投影哪个好 家用智能投影仪对比
- LTE学习理解系列——TDD LTE信源指定时隙配比设置
- ChatGPT翻译怎么样-ChatGPT批量翻译工具软件
- TortoiseSVN安装最新版,设置中文;并修改比对工具为BeyondCompare
热门文章
- 可以在家庭DVD影碟机上播放的HDVD光盘简易制作步骤
- 有万能PDF格式转换器吗
- 华为端口聚合命令_华为S5735交换机基本设置-端口聚合lacp
- rbac java框架_jCasbin:支持MAC、RBAC、ABAC多种模型的Java权限管理框架
- linux和windows关闭端口号的命令
- 【电气专业知识问答】问:大电流滑环和电刷的选用、定期检查应关注的问题和注意事项是什么?
- 腾讯面试,面试官第一个问题是Int占多少字节,程序员不知所措
- MCGS昆仑通态触摸屏导入博途自定义数据类型和DB块变量的具体方法演示
- gif透明背景动画_PS教程:制作动态界面展示GIF动画效果
- 2020 BAT大厂数据开发面试经验:“高频面经”之大数据研发篇