69 RGB图像转单色位图
1 前言
前段时间搞了一下电子墨水屏显示项目,用的这款墨水屏不能直接显示彩色图、灰度图及二值图,需要将图像转换成单色位图才能显示。
单色位图这还是第一次接触,后面看了资料了解到单色位图和二值图类似。二值图单个像素用8Bit存储,要么是0要么是255,而单色位图单个像素用1bit存储,要么是0要么是1,就存储空间来说,单色位图比二值图直接节省8倍空间,实属nice。
2 转换实验
本次实验环境是在QT上弄的,对图像处理是直接操作像素实现的,将图像转为单色位图整体流程如下:
(1)加载图片;
直接用QT的图像类QImage加载图像,并将图像缩放成分辨率为240*360图像。
//加载图像
orgimg->load(file_path);
//图像szie控制
QImage sImg = orgimg->scaled(240, 360).scaled(240, 360, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
//显示图像
ui->orgImglabel->setPixmap(QPixmap::fromImage(sImg));
(2)图像灰度化;
(3)图像二值化;
将加载的RGB图像通过下述公式,将RGB图像转成灰度图。
在转换灰度图时,将每个像素与阈值比较,将像素二值化,取值0或255。
//图像灰度化+二值化
for(int ni =0; ni<360;ni++)
{for(int nj=0;nj<240;nj++){QColor clr = sImg.pixelColor(nj,ni);//通过RGB计算像素灰度值int nGray = (30*clr.red() + 59*clr.green() + 11*clr.blue())/100;//判定灰度值是否达到阈值,从而将图像二值化if(nGray>grayThreshold)nGray = 250;elsenGray = 0;//二值化后的图像数据grayData[uPos++] = (uint8_t)nGray;//设置像素点的灰度值用以在上位机上显示grayimg->setPixel(nj,ni,nGray);}
}
(4)生成单色位图;
在进行图像二值化的时,我们将像素保存 在grayData[]数组中,其数值要么就是0要么就是250,。在二值图转单位位图时,如果grayData[ni]是0,那么单色位图对应bit就是0,如果是250,那么bit就是1。也就是用1bit来表示白和黑,二值图转单色位图代码示例如下:
//存放位图的数组
uint8_t grayData2[240*360/8] = {0};
//二值化图像转单色位图
uPos = 0;
int nj = 7;for(int ni=0;ni<240*360;ni++)
{//二值图1Byte一个像素,单色位图1bit一个像素//二值图每处理8个像素,单色位图保存1Byte数据if(ni%8==0 && ni!=0){uPos++;}//grayData[ni] 是二值图像素数据//grayData2[uPos] 是单色位图像素数据保存数组grayData2[uPos] |= (grayData[ni]>128)?((uint8_t)(1<<nj)):((uint8_t)(0<<nj));if(nj>=1) {nj--;}else {nj =7;}
}
转换后效果图如下,但可以单色位图其跟二值图显示效果是一样的,就是黑白图像,只是单色位图存储像素是用bit来表示,即存储空间不一样。
参考:
1.http://t.zoukankan.com/hfultrastrong-p-9250219.html
2.https://blog.csdn.net/weixin_44523062/article/details/112852165
3.http://t.zoukankan.com/yongdaimi-p-11131265.html
69 RGB图像转单色位图相关推荐
- 索引图像和RGB图像 位图图像和矢量图像
最近在学习数字图像处理,在matlab实验中多次看到index image,rgb image,gray image....以及rgb2gray(),ind2gray()函数,很好奇索引图像和RGB图 ...
- 数字图像基础(二进制图像、灰度图像、RGB图像、索引图像和多帧图像)
1. 图像的分类 根据图像的属性不同,图像分类的方法也不同. ①从获取方式上图像分为拍摄类图像和绘制类图像: ②从颜色上图像分为彩色图像.灰度图像和黑白图像等: ③从内容上图像分为人物图像.风景图像等 ...
- java bmp rgb数组_将RGB数据写入BMP位图文件
CFile file; //定义一个文件对象 _ASSERTE(file.Open(CString("E:\\94.bmp"), CFile::modeRead));//打开文件 ...
- win32编程,将rgb图像绘制到窗口句柄
win32绘图代码段,将rgb数据绘制到hWnd上 void Show(HWND hwnd, unsigned char* rgb, int w, int h) {HDC hdc = GetDC(hw ...
- RGB图像之灰度级和通道的理解(矩阵含义等)
一言以敝之:图像有R,G,B三个二维矩阵,矩阵数值在0-255之间,数值大小表示允许通过色彩多少,也称为灰度值,灰度越大,相应色彩越深(此处为光,故R,G,B均为0为黑色) 具体参考下列介绍: 最近刚 ...
- RGB图像之灰度级和通道的理解
最近刚开始学数字图像处理,在看到灰度级时候以为灰度只是表示黑白/深浅色图像,其实灰度级指黑白显示器中显示像素点的亮暗差别,在彩色显示器中表现为颜色的不同,灰度级越多,图像层次越清楚逼真. 注意,灰度值 ...
- RGB图像转为灰度图
最后结论: Grey = (R*38 + G*75 + B*15)>> 7 代码 #include <cv.h> #include <highgui.h>using ...
- 将RGB数据写入BMP位图文件
<span style="font-size:18px;">CFile file; //定义一个文件对象 _ASSERTE(file.Open(CString(&quo ...
- java生成bmp单色位图,关于GDI+生成单色BMP图片的问题,请高手进!
用GDI+生成的BMP图片颜色位数一般都是24位,我要怎样生成1位的BMP图片呢? 我在网上找了几种方法,有的方法效果是达到了,但是效率非常低,我是要生成几万张甚至几十万张的,所以要求速度要够快. 不 ...
最新文章
- RMB符号的几种显示方式。
- 数据库高可用和分区解决方案-MySQL 篇
- 转: 如何从keystore file中查看数字证书信息
- java getbasicremote_Vue+Java 通过websocket实现服务器与客户端双向通信操作
- linux如何生成so文件,新人问个问题,莫见笑:关于如何生成so文件,大家多多捧场啊...
- jakarta ee_Jakarta EE贡献–入门
- 一个标签的72变,打造一个纯CSS图标库
- Linux网络协议栈:网络包接收过程
- hashmap java 便利_java HashMap 循环遍历map的方法
- JAVA_WEB程序设计教程 pdf
- 3GP转换器 Pro 3.5
- 华为手机计算机快捷设置密码,华为手机首次重启绘制图案密码后让输入解锁密码。我没有设置呀?怎么办...
- 联合分布,边缘分布,条件分布,互信息
- 什么是外贸ERP系统?
- linux 安装Times New Roman字体
- ConcurrenHashMap源码(JDK1.7)
- 2017男宝宝起名大全来了,快来给你的孩子挑个好名字吧
- idea IntelliJ IDEA 2018.2.5 x64 破解
- 服务器有国产化系统吗,服务器国产化
- 在linux中安装gdb遇到的问题
热门文章
- java 1~N阶乘之和的运算
- ArcGis国土空间”一张图”填报操作技巧(四)零编程基础批量添加字段并设置字段属性
- 挑战运营商?创业公司的N种活法
- C++实验五:人口普查统计+汉诺塔问题
- 挖矿病毒应急响应分析
- [转载]使用Ogre 3D 运动模型 -----OGRE 3D 1.7 Beginner‘s Guide中文版 第五章
- Oracle标识符无效
- 双一流学科计算机科学与工程,西安电子科技大学双一流学科名单2个【教育部公布】...
- 数据结构与算法作业3——约瑟夫环问题(循环链表)
- session会话中removeAttribute()和invalidate()的区别是什么