QT总结4-QImage

使用QT读取图像时与使用opencv读取图像还是有一定差别的,QImage读取图像时如果使用默认的方式读取

QImage image = QImage(path);

则读取的图像默认会是四通道的图像,类型为QImage::Format_ARGB32,也就是说qt会默认的对图像增加alpha通道,并且图像都是以彩色图的形式被读进来的。

opencv读取图像的默认形式

cv::Mat mat = cv::imread(path);

此时opencv将会以彩色图的形式进行读取,也就是默认的参数是1,如果希望以灰度图的形式进行读取则要使用参数0。

当希望用OpenGL进行纹理的载入的时候,QT会提供一个转化函数

QImage tex = QGLWidget::convertToGLFormat(image);

利用这个函数可以将QT读取的图像转化为OpenGL纹理需要的格式,虽然仍然以QImage的方式存储,但是已经不是QT所需要的格式,而是以OpenGL的形式存储。(简单的说就是把bgr换成rgb的形式,同时对图像进行一次翻转。其中应该还有一些不同)

OpenGL格式的纹理默认是从左下角开始的,也就是说跟正常的图像是反着的,所以QT提供的函数会将图像翻过来,贴图的时候会是正的。

同样这个函数在转化的时候会将图像以四通道的形式进行转化,也就是说会默认带有alpha通道。这一点是要注意的,因为OpenGL对纹理的原始格式是有要求的,指定转化目标类型可以与原始类型不同,但是原始类型一定要与原始图像相匹配,否则显示时纹理会变得很奇怪。

另外,我在利用QImage向Mat转化的时候发现不能使用

cv::Mat src(currentImage.height(), currentImage.width(), CV_8UC4, (void*)(QGLWidget::convertToGLFormat(qimage).bits()));
cv::Mat dst;
cvtColor(src, dst, CV_BGRA2BGR);//此时颜色转化会报错

但是可以这样写

QImage temp = QGLWidget::convertToGLFormat(currentImage);
cv::Mat src(currentImage.height(), currentImage.width(), CV_8UC4, (void*)temp.bits());
cv::Mat dst;
cvtColor(src, dst, CV_BGRA2BGR);

这样写就不会报错。原因很可能是在于QImage和OpenGL在qt中还是有不同的地方,不能直接使用。

QImage中存在一种比较特殊的图,Format_Indexed8格式是一个索引图,其中保存的是对应rgb颜色组的索引值(目的应该是为了节省空间和加快速度)。这个格式在转换为Mat的灰度图的过程中应该是进行了一次隐式的转化,将图像的格式转化为了Format_Grayscale8,然后转化为了Mat,这样就保持了一致。我测试了转化前后的类型,发现类型发生了改变,应该是自动进行了转化的计算。(其中QImage应该是通过一个公式将rgb颜色转化为了灰度图,因为Format_Indexed8本身是可以显示彩色图的)。

### 回答1: Qt的QImage类可以用来读取单通道灰度图像。 在使用QImage读取单通道灰度图时,需要注意以下几点: 1. 首先,需要包含Qt的头文件QImage和QColor。 #include <QImage> #include <QColor> 2. 定义一个QImage对象,并指定图像路径。 QImage image("path/to/gray_image.png"); 3. 接着,可以使用QImage的width()和height()函数获取图像的宽度和高度。 int width = image.width(); int height = image.height(); 4. 使用QImage的pixelColor()函数按照坐标位置获取像素值。由于灰度图只有一个通道,所以可以直接通过QColor的red()、green()或blue()函数获取灰度值。 for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { QColor pixelColor = image.pixelColor(x, y); int grayValue = pixelColor.red(); // 获取灰度值 // 进行灰度图像的处理 } } 5. 对于单通道灰度图像,可以直接将灰度值作为RGB三个通道的数值,以创建新的QColor对象。 for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { QColor pixelColor = image.pixelColor(x, y); int grayValue = pixelColor.red(); // 获取灰度值 QColor newPixelColor(grayValue, grayValue, grayValue); // 创建新的QColor对象 // 进行灰度图像的处理 } } 如此,就可以使用Qt的QImage类来读取单通道灰度图,通过获取像素颜色并处理灰度值,实现进一步的图像处理操作。 ### 回答2: Qt中的QImage类可以用来读取和处理图像。对于单通道灰度图像,可以使用QImage::Format_Indexed8来表示。下面是一个使用Qt读取单通道灰度图像的示例: ```cpp QImage image("path/to/image.png"); // 指定图像路径 if (image.isNull()) { // 图像加载失败 } else { if (image.format() == QImage::Format_Indexed8) { // 图像是单通道灰度图 // 可以在这里进行图像处理或分析 // 获取图像的宽度和高度 int width = image.width(); int height = image.height(); // 遍历图像的像素 for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { // 获取像素的灰度值 QRgb pixel = image.pixel(x, y); int gray = qGray(pixel); // 在这里可以对灰度值进行处理 // ... // 将处理后的灰度值设置回图像 image.setPixel(x, y, qRgb(gray, gray, gray)); } } // 保存处理后的图像 image.save("path/to/processed_image.png"); } else { // 图像不是单通道灰度图 } } ``` 上面的示例代码使用QImage读取图像,并检查图像是否为单通道灰度图。如果是灰度图,可以对像素进行处理或分析,然后保存处理后的图像。如果图像不是灰度图,则可以根据需要进行其他操作。请注意,这只是一个示例,并且可以根据实际需求进行修改和扩展。 ### 回答3: 在Qt中,可以使用QImage类来读取和处理图像。对于单通道灰度图像,可以使用QImage::Format_Grayscale8格式来加载图像。 首先,需要包含头文件<QImage>和<QDebug>: ```cpp #include <QImage> #include <QDebug> ``` 然后,可以使用QImage的load()函数加载图像文件: ```cpp QImage img; if (img.load("path/to/image.png")) { qDebug() << "图像加载成功"; } else { qDebug() << "图像加载失败"; } ``` 加载成功后,可以通过QImage的width()和height()函数获取图像的宽度和高度: ```cpp int width = img.width(); int height = img.height(); qDebug() << "图像宽度:" << width; qDebug() << "图像高度:" << height; ``` 接下来,可以使用QImage的pixel()函数来访问图像的像素值。对于单通道灰度图像,每个像素只有一个值,可以使用qRed()函数来提取该值: ```cpp for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { int grayValue = qRed(img.pixel(x, y)); qDebug() << "像素位置(" << x << ", " << y << ")的灰度值:" << grayValue; } } ``` 最后,记得使用QImage的save()函数保存修改后的图像: ```cpp if (img.save("path/to/modified_image.png")) { qDebug() << "图像保存成功"; } else { qDebug() << "图像保存失败"; } ``` 总结:使用QImage的load()函数加载单通道灰度图像,在循环中使用qRed()函数提取像素的灰度值,并使用save()函数保存修改后的图像。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值