社区
Qt
帖子详情
Qt中使用什么类把真彩色变成黑白两色?
Mymakekuhu
2014-04-03 05:54:01
在Qt中用什么类来处理图片让其真彩色变成黑白色,或能让黑白色变成真彩色!
得到答案立即结贴!
...全文
546
4
打赏
收藏
Qt中使用什么类把真彩色变成黑白两色?
在Qt中用什么类来处理图片让其真彩色变成黑白色,或能让黑白色变成真彩色! 得到答案立即结贴!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Mymakekuhu
2014-04-03
打赏
举报
回复
谢谢 , 解决了!
Mymakekuhu
2014-04-03
打赏
举报
回复
我试试,我以为Qt会有专门类来处理,看来有点麻烦!
青松2
2014-04-03
打赏
举报
回复
真彩色可以灰度化变成黑白图像,黑白图像要变成彩色就不得要领了。。。
青松2
2014-04-03
打赏
举报
回复
[转载]qt编程图像灰度化改进与详细注释 (2012-08-03 22:53:27)转载▼ 标签: 转载 原文地址:qt编程图像灰度化改进与详细注释作者:930154711 最近在使用qt研究图像处理,第一步必然是最基础的图像灰度化,由于初学qt,对qt图像处理这一块一点头绪也没有,此时只好百度!网络上有人介绍了,qt提供四种图像类型:QImage, QPixmap, QPicture, QBitmap, 根据qt 文档对这四种类型的解释,发现QImage正是我需要的类型,可以很方便地读取图像的像素信息。 接着继续百度qt如何灰度化图像,找到的代码有两种: 一种是使用color table的方法: #include<QApplication> 02 #include<QLabel> 03 #include<QDebug> 04 05 const QString rgbFile("special.jpg"); 06 const QString grayFile("gray.jpg"); 07 08 static bool convertToGray(); 09 10 int main(int argc,char *argv[]) 11 { 12 QApplication app(argc,argv); 13 QLabel rgbLabel,grayLabel; 14 15 if(!convertToGray()){ 16 return 1; 17 } 18 19 rgbLabel.setPixmap(QPixmap(rgbFile)); 20 grayLabel.setPixmap(QPixmap(grayFile)); 21 rgbLabel.show(); 22 grayLabel.show(); 23 return app.exec(); 24 } 25 26 //转为灰度图 27 static bool convertToGray() 28 { 29 QImage rgbImage(rgbFile); 30 QSize size=rgbImage.size(); 31 QImage grayImage(size,QImage::Format_Indexed8); 32 int width=size.width(); 33 int height=size.height(); 34 uchar * rgbImageData=rgbImage.bits(); 35 uchar * grayImageData=grayImage.bits(); 36 37 if(rgbImage.isGrayscale()){ 38 qDebug()<<"Image is already gray!Conversion stopped!"; 39 return false; 40 } 41 42 //若width不是4的倍数,会自动添加字节,使之对齐到4的倍数 43 int realWidth1=rgbImage.bytesPerLine(); 44 int realWidth2=grayImage.bytesPerLine(); 45 uchar * backup1=rgbImageData; 46 uchar * backup2=grayImageData; 47 //直接取用green绿色分量值作为gray索引值 48 for(int i=0;i<height; 49 i++, 50 rgbImageData=backup1+realWidth1*i, 51 grayImageData=backup2+realWidth2*i){ 52 for(int j=0;j<width;j++){ 53 *grayImageData=*(rgbImageData+1); 54 rgbImageData+=4; 55 grayImageData++; 56 } 57 } 58 59 QVector<QRgb> grayColorTable; 60 uint rgb=0; 61 for(int i=0;i<256;i++){ 62 grayColorTable.append(rgb); 63 rgb+=0x00010101;//r,g,b值分别加1,a值不变,见QRgb说明 64 } 65 66 grayImage.setColorTable(grayColorTable); 67 grayImage.save(grayFile); 68 return true; 69 } 主要看static bool convertToGray() 方法的处理,很多人看不懂 52 for(int j=0;j<width;j++){ 53 *grayImageData=*(rgbImageData+1); 54 rgbImageData+=4; 55 grayImageData++; 56 } 的意思,其实这里的灰度化并没有用到常用的灰度化公式 0.30R+0.59G+0.11B 而是简单地把,绿色通道的值取出来作为灰度值,因为图像内颜色存储顺序是BGRA,所以rgbImageData+1获得的就是G通道的值,理解这个之后就很容更改成标准的灰度化公式了,至于上面其他的代码还有不懂的,可以看下面我改进后的代码的注释: QImage rgbImage("C:\Documents and Settings\Administrator\test.jpg");//通过文件路径读取图片 QSize size=rgbImage.size();//获得图像小 QImage grayImage(size,QImage::Format_Indexed8);//创建同样大小深度为8(即每个像素占8位)的空白图 int width=size.width(); int height=size.height(); uchar * rgbImageData=rgbImage.bits();//获得图像像素的首地址,因为存储顺序是BGRA,所以首地址指向B uchar * grayImageData=grayImage.bits(); //若width不是4的倍数,会自动添加字节,使之对齐到4的倍数 int realWidth1=rgbImage.bytesPerLine();//一行有多少个byte int realWidth2=grayImage.bytesPerLine(); uchar * backup1=rgbImageData; uchar * backup2=grayImageData; for(int i=0;i<height; i++, rgbImageData=backup1+realWidth1*i, grayImageData=backup2+realWidth2*i){ for(int j=0;j<width;j++){ uchar r = (*(rgbImageData+2))*0.3; uchar g = (*(rgbImageData+1))*0.59; uchar b = (*rgbImageData)*0.11;//使用标准灰度化公式 *grayImageData=r + g + b; rgbImageData+=4;//跳到下一个B,以为BGRA,原图是4个uchar作为一个像素 grayImageData++; //因为灰色本身rgb值就必须相等,这里只用1个uchar存储颜色作为一个像素,所以需要用到color table //因此这里存的1个uchar只是color table的索引值,通过这个uchar在color table中找到真正的颜色 } } //要注意color table用qvector实现,是一个顺序的连续的链表,里面存的是qrgb,qrgb的颜色顺序是0xAARRGGBB //灰度图的color table 很简单,就是从第一个是0x00000000,开始,到下一个0x00010101,不断加1,加到00ffffff QVector<QRgb> grayColorTable; uint rgb=0; for(int i=0;i<256;i++){ grayColorTable.append(rgb); rgb+=0x00010101;//r,g,b值分别加1,a值不变,见QRgb说明 } grayImage.setColorTable(grayColorTable); grayImage.save("grayhahaR.jpg"); grayImage.load("grayhahaR.jpg"); //可能是因为灰度图使用了colortable的原因,直接调用fromImage方法转成qpixmap会显示不出来, //只能先把灰度图保存,再重新load一遍,才能在qlabel中显示 ui->picLabel->setPixmap(QPixmap::fromImage(grayImage)); 另一种方法是直接取出图像里的每个像素,使用qt自带的单个像素灰度方法qGray(),这个方法思想很简单不多加解释,就是使用的空间比color table的方法大很多,至于选择哪一种,自己决定,下面贴出网上的源代码: void Picture::paintEvent(QPaintEvent*){ QImage image; image = QImage("airplane.jpg").scaled(200,200); int w,h; w = image.width(); h = image.height(); QImage iGray(w,h,QImage::Format_RGB32);for(int i=0;i<200;i++){ for(int j=0;j<200;j++){ QRgb pixel = image.pixel(i,j); int gray = qGray(pixel); QRgb grayPixel = qRgb(gray,gray,gray); iGray.setPixel(i,j,grayPixel); } } QPainter painter(this); painter.drawImage(0,0,image); painter.drawImage(200,0,iGray); } 不知道为啥,最后这段代码copy下来发布后,代码变的各种乱,还是贴出源地址吧:http://www.cnblogs.com/xianglan/archive/2010/12/24/1915905.html
伪彩色、
真彩色
和直接色区别与联系
伪彩色处理 将彩色图像转换为灰度图像是一个不可逆的过程,灰度图像也不可能变换为原来的彩色图像。而某些场合需要将灰度图像转变为彩色图像;伪彩色处理主要是把
黑白
的灰度图像或者多波段图像转换为彩色图像的技术过程。其目的是提高图像内容的可辨识度。其
中
方法有,灰度分成法,灰度变换法。
真彩色
(true color)
真彩色
是指在组成一幅彩色图像的每个像素值
中
,有R,G,B三个基色分量,每个基色分量直接决定显示设备的基色强度,这样产生的彩色称为
真彩色
。例如用RGB 5∶5∶5表示的彩色图像,R,G,B各用5位,用
qt
获取图像的每个像素rgb_一文带你彻底掌握数字化图像数据
点击上面“蓝字”关注我,干货满满哦!数字图像处理是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术。在计算机
中
,按照颜色和灰度的多少可以将图像分为二值图像、灰度图像、索引图像和
真彩色
RGB图像四种基本
类
型。目前,大多数图像处理软件都支持这四种
类
型的图像。图像的基本
类
型二值图像一幅二值图像的二维矩阵仅由0、1两个值构成,“0”代表黑色,“1”代白色。由于每一像素(...
【亲测免费】 推荐项目:pyTermTk —— 打造终端的魔法界面
在数字化世界的深邃角落里,有一项名为 `pyTermTk` 的宝藏正等待着探险者的发掘。这是一款专为开发者和终端爱好者设计的文本基础用户界面库(TUI),以Python 3.9及其以上版本为驱动引擎。它自诞生之日起,就旨在复兴命令行界面的魅力,带来如同
Qt
5、GTK与tkinter融合后的创新体验,并且带有其作者独到的理解与革新。 ## 项目技术分析 ### 核心特性 - **完全独立**:无
用
Qt
Creator手把手教你解析BMP文件头:从二进制流到QImage显示的完整流程
本文详细介绍了如何
使用
Qt
Creator解析BMP文件头,从二进制流到QImage显示的完整流程。通过深入解析BMP文件格式、处理不同位深度的图像数据,并结合
Qt
框架实现高效的BMP解析工具
类
,帮助开发者掌握数字图像处理的核心技术。
探索无限细节:XaoS分形缩放器的艺术与科学之旅
想象一下,你手握一枚可以无限放大的数字显微镜,每一层放大都揭示出更加复杂、更加美丽的几何图案。这不是科幻小说,而是XaoS分形缩放器带给你的真实体验。这个开源工具让你能够实时探索分形世界的无限细节,在数学的秩序与混沌之间自由穿梭。 ## 分形世界的数字探险 分形几何被誉为"上帝的指纹",在自然界无处不在——从蕨
类
植物的叶片到海岸线的轮廓,从云朵的形状到山脉的起伏。传统上,探索这些无限复杂的结构
Qt
21,503
社区成员
26,693
社区内容
发帖
与我相关
我的任务
Qt
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
复制链接
扫一扫
分享
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章