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图像转单色位图相关推荐

  1. 索引图像和RGB图像 位图图像和矢量图像

    最近在学习数字图像处理,在matlab实验中多次看到index image,rgb image,gray image....以及rgb2gray(),ind2gray()函数,很好奇索引图像和RGB图 ...

  2. 数字图像基础(二进制图像、灰度图像、RGB图像、索引图像和多帧图像)

    1. 图像的分类 根据图像的属性不同,图像分类的方法也不同. ①从获取方式上图像分为拍摄类图像和绘制类图像: ②从颜色上图像分为彩色图像.灰度图像和黑白图像等: ③从内容上图像分为人物图像.风景图像等 ...

  3. java bmp rgb数组_将RGB数据写入BMP位图文件

    CFile file; //定义一个文件对象 _ASSERTE(file.Open(CString("E:\\94.bmp"), CFile::modeRead));//打开文件 ...

  4. win32编程,将rgb图像绘制到窗口句柄

    win32绘图代码段,将rgb数据绘制到hWnd上 void Show(HWND hwnd, unsigned char* rgb, int w, int h) {HDC hdc = GetDC(hw ...

  5. RGB图像之灰度级和通道的理解(矩阵含义等)

    一言以敝之:图像有R,G,B三个二维矩阵,矩阵数值在0-255之间,数值大小表示允许通过色彩多少,也称为灰度值,灰度越大,相应色彩越深(此处为光,故R,G,B均为0为黑色) 具体参考下列介绍: 最近刚 ...

  6. RGB图像之灰度级和通道的理解

    最近刚开始学数字图像处理,在看到灰度级时候以为灰度只是表示黑白/深浅色图像,其实灰度级指黑白显示器中显示像素点的亮暗差别,在彩色显示器中表现为颜色的不同,灰度级越多,图像层次越清楚逼真. 注意,灰度值 ...

  7. RGB图像转为灰度图

    最后结论: Grey = (R*38 + G*75 + B*15)>> 7 代码 #include <cv.h> #include <highgui.h>using ...

  8. 将RGB数据写入BMP位图文件

    <span style="font-size:18px;">CFile file; //定义一个文件对象 _ASSERTE(file.Open(CString(&quo ...

  9. java生成bmp单色位图,关于GDI+生成单色BMP图片的问题,请高手进!

    用GDI+生成的BMP图片颜色位数一般都是24位,我要怎样生成1位的BMP图片呢? 我在网上找了几种方法,有的方法效果是达到了,但是效率非常低,我是要生成几万张甚至几十万张的,所以要求速度要够快. 不 ...

最新文章

  1. RMB符号的几种显示方式。
  2. 数据库高可用和分区解决方案-MySQL 篇
  3. 转: 如何从keystore file中查看数字证书信息
  4. java getbasicremote_Vue+Java 通过websocket实现服务器与客户端双向通信操作
  5. linux如何生成so文件,新人问个问题,莫见笑:关于如何生成so文件,大家多多捧场啊...
  6. jakarta ee_Jakarta EE贡献–入门
  7. 一个标签的72变,打造一个纯CSS图标库
  8. Linux网络协议栈:网络包接收过程
  9. hashmap java 便利_java HashMap 循环遍历map的方法
  10. JAVA_WEB程序设计教程 pdf
  11. 3GP转换器 Pro 3.5
  12. 华为手机计算机快捷设置密码,华为手机首次重启绘制图案密码后让输入解锁密码。我没有设置呀?怎么办...
  13. 联合分布,边缘分布,条件分布,互信息
  14. 什么是外贸ERP系统?
  15. linux 安装Times New Roman字体
  16. ConcurrenHashMap源码(JDK1.7)
  17. 2017男宝宝起名大全来了,快来给你的孩子挑个好名字吧
  18. idea IntelliJ IDEA 2018.2.5 x64 破解
  19. 服务器有国产化系统吗,服务器国产化
  20. 在linux中安装gdb遇到的问题

热门文章

  1. java 1~N阶乘之和的运算
  2. ArcGis国土空间”一张图”填报操作技巧(四)零编程基础批量添加字段并设置字段属性
  3. 挑战运营商?创业公司的N种活法
  4. C++实验五:人口普查统计+汉诺塔问题
  5. 挖矿病毒应急响应分析
  6. [转载]使用Ogre 3D 运动模型 -----OGRE 3D 1.7 Beginner‘s Guide中文版 第五章
  7. Oracle标识符无效
  8. 双一流学科计算机科学与工程,西安电子科技大学双一流学科名单2个【教育部公布】...
  9. 数据结构与算法作业3——约瑟夫环问题(循环链表)
  10. session会话中removeAttribute()和invalidate()的区别是什么