qt中调色板索引图像文件转换成cv:Mat格式

server/2024/9/25 5:38:22/

如果你的 QImage 使用的是 QImage::Format_Indexed8 格式,这意味着图像是一个 8 位的索引图像。每个像素值是一个 8 位的索引,用于查找调色板中的颜色。这种格式通常用于调色板索引的图像,并且需要一个额外的调色板来解码实际的颜色信息。

在 OpenCV 中,处理这种格式的步骤包括从 QImage 中提取调色板,并将图像数据转换为 RGB 或 BGR 格式。

处理 QImage::Format_Indexed8 格式的步骤

  1. 提取调色板: 从 QImage 中提取调色板,并将其转换为 cv::Mat 中可用的颜色格式。

  2. 创建 RGB/BGR 图像: 使用调色板来创建一个实际的 RGB/BGR 图像。

示例代码

以下是一个处理 QImage::Format_Indexed8 格式并将其转换为 cv::Mat RGB 图像的示例代码:

#include <QImage>
#include <opencv2/opencv.hpp>
#include <iostream>cv::Mat QImageToMat(const QImage& qImage) {if (qImage.format() == QImage::Format_Indexed8) {// 提取调色板QImage::Format format = qImage.format();if (format == QImage::Format_Indexed8) {// 获取调色板QVector<QRgb> colorTable = qImage.colorTable();int numColors = colorTable.size();cv::Mat colorMat(numColors, 1, CV_8UC3);for (int i = 0; i < numColors; ++i) {QRgb color = colorTable[i];colorMat.at<cv::Vec3b>(i, 0) = cv::Vec3b(qRed(color), qGreen(color), qBlue(color));}// 创建一个 cv::Mat 来存储灰度图像cv::Mat matImage(qImage.height(), qImage.width(), CV_8UC1, (void*)qImage.bits(), qImage.bytesPerLine());// 将灰度图像转换为 RGB 图像cv::Mat matImageRGB;cv::Mat matColorImage;cv::cvtColor(matImage, matColorImage, cv::COLOR_GRAY2BGR);// 使用调色板将索引图像转换为实际颜色图像cv::Mat matResultImage(qImage.height(), qImage.width(), CV_8UC3);for (int y = 0; y < matImage.rows; ++y) {for (int x = 0; x < matImage.cols; ++x) {uchar index = matImage.at<uchar>(y, x);matResultImage.at<cv::Vec3b>(y, x) = colorMat.at<cv::Vec3b>(index, 0);}}return matResultImage;}}std::cerr << "Unsupported QImage format!" << std::endl;return cv::Mat();
}int main() {QImage qImage("path_to_image.png");if (qImage.isNull()) {std::cerr << "Failed to load image!" << std::endl;return -1;}cv::Mat matImage = QImageToMat(qImage);if (!matImage.empty()) {cv::imshow("Converted Image", matImage);cv::waitKey(0);}return 0;
}


http://www.ppmy.cn/server/98528.html

相关文章

poetry配置镜像

1.简介 poetry 是一个包管理和打包的工具。 在 Python 中&#xff0c;对于初学者来说&#xff0c;打包系统和依赖管理是非常复杂和难懂的。即使对于经验丰富的开发者&#xff0c;一个项目总是要同时创建多个文件&#xff1a; setup.py ,requirements.txt,setup.cfg , MANIFES…

有关OmniFocus的几个问题

一位学员向我提了几个有关OmniFocus的问题&#xff0c;我进行了解答&#xff0c;给大家分享一下。 问题&#xff08;一&#xff09; 我们要尽快和尽少地花费时间资源去处理任务&#xff0c;那是不是任务排程时就要制定规则。我有个规则&#xff0c;事前三问。这件事有无价值&am…

文档控件DevExpress Office File API v24.1 - 支持基于Unix系统的打印

DevExpress Office File API是一个专为C#, VB.NET 和 ASP.NET等开发人员提供的非可视化.NET库。有了这个库&#xff0c;不用安装Microsoft Office&#xff0c;就可以完全自动处理Excel、Word等文档。开发人员使用一个非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…

线程与多线程(一)

线程与多线程&#xff08;一&#xff09; 一、线程1、概念2、示意图3、虚拟地址转换到物理地址4、与进程相比的优点5、与进程相比的缺点6、与进程的关系&#xff08;1&#xff09;线程独有&#xff08;2&#xff09;共享&#xff08;3&#xff09;示意图 二、POSIX线程库三、创…

JAVA实现判断小程序用户是否关注公众号

本文主要描述了判断小程序用户是否关注公众号的逻辑实现及部分代码 首先阐述一下大致流程&#xff1a; 1、在将小程序和公众号绑定至同一个微信开发平台下&#xff1b; 2、后端拉取公众号已关注用户列表&#xff0c;并获取其中每一个用户的unionID&#xff0c; 建立已关注用户…

SpringMVC (发送请求——>参数传递—— >响应数据)

设置请求访问路径 RequestMapper&#xff1a;将请求访问路径和我们业务层的方法联系起来 ResponseBody&#xff1a;将我们业务层方法的返回值转化为json&#xff0c;xml或其他格式的数据返回给页面 两种请求 get请求 post请求 测试案例 RequestMapping("/getNameAndAge&…

nginx 反向代理tomcat设置

root /usr/myweb; 1.#rewrite ^/$ /ljf/ last; 反向二级目录 2.#反向tomcat网站 rewrite / http://192.168.178.128:8080/login.jsp last; 3. jsp转向tomcat网站 location / { proxy_pass http://192.168.124.13; proxy_set_header X-Real-IP $remote_…

【手撕数据结构】二叉树和堆

目录 树的概念树的相关概念二叉树二叉树的概念满二叉树和完全二叉树 堆的概念与结构堆的向上调整算法思路分析代码详细解说 堆的向下调整算法算法图解分析代码详解分析 堆的各个接口堆的定义及声明堆的初始化堆的销毁堆的插入堆的删除取堆顶数据堆的数据个数堆的判空 树的概念 …