我正在使用boost进行图像处理,我发现boost :: gil对于新手而言有点过于复杂..所以我尝试使用boost中的其他可用库来开始。
基本上我想做的是 1.读取灰度图像。 2.将像素值加载到增强矩阵中。 3.对矩阵应用随机滤波器。 4.将矩阵转换回图像并显示图像。
到目前为止,我所做的是 QPixmap pixmap("lena.bmp");
pixmap = pixmap.copy(512,512,128,128);
pixmap = pixmap.scaled(128,128);
QImage image = pixmap.toImage();
QRgb col;
int g;
int width = pixmap.width();
int height = pixmap.height();
matrix<double> m(width,height);
for (int j = 0; j < m.size2(); j++)
{
for (int i = 0; i < m.size1(); i++)
{
m(i,j) = qGray(image.pixel(i,j));
}
}
所以基本上我猜像素值被保存到一个矩阵'm'现在我想显示这个矩阵,因为图像是否存在我可以做到这一点?
提前致谢
答案 0 :(得分:0)
这是一个将过滤后将Boost矩阵转换回QImage的示例。它将QImage转换为QPixmap,然后可以使用QLabel显示。我将您的图像过滤代码放在一个单独的类中,从而将您的逻辑和GUI分开。
它使用C ++ 11功能,因此您需要使用构建系统定义C ++ 11。如果您正在使用Qt Creator,请将CONFIG + = c ++ 11添加到.pro文件中。
<强> ImageFilter.cpp 强>
#include "ImageFilter.hpp"
#include <QPixmap>
ImageFilter::ImageFilter(QObject* parent)
: QObject(parent) {
}
void ImageFilter::processImage() {
const QImage& image = loadImage("lena.bmp");
const auto& matrix = imageToMatrix(image);
// Apply filters to matrix
const QImage& filteredImage = matrixToImage(matrix);
const QPixmap& filteredPixmap = QPixmap::fromImage(filteredImage);
emit sendPixmap(filteredPixmap);
}
boost::numeric::ublas::matrix<double> ImageFilter::imageToMatrix(const QImage& image) {
const auto width = image.width();
const auto height = image.height();
boost::numeric::ublas::matrix<double> m(width, height);
for (int i = 0; i < m.size1(); ++i) {
for (int j = 0; j < m.size2(); ++j) {
m(i, j) = qGray(image.pixel(i, j));
}
}
return m;
}
QImage ImageFilter::matrixToImage(const boost::numeric::ublas::matrix<double>& m) {
QImage image(static_cast<int>(m.size1()),
static_cast<int>(m.size2()),
QImage::Format_RGB32);
for (int i = 0; i < m.size1(); ++i) {
for (int j = 0; j < m.size2(); ++j) {
auto value = qRgb(m(i, j), m(i, j), m(i, j));
image.setPixel(i, j, value);
}
}
return image;
}
QImage ImageFilter::loadImage(const QString& imageFilePath) {
QPixmap pixmap(imageFilePath);
pixmap = pixmap.copy(512, 512, 128, 128);
pixmap = pixmap.scaled(128, 128);
return pixmap.toImage();
}
<强> ImageFilter.hpp 强>
#ifndef IMAGEFILTER_HPP
#define IMAGEFILTER_HPP
#include "boost/numeric/ublas/matrix.hpp"
#include <QImage>
#include <QObject>
#include <QString>
class ImageFilter : public QObject {
Q_OBJECT
public:
explicit ImageFilter(QObject* parent = nullptr);
signals:
void sendPixmap(const QPixmap& pixmap);
public slots:
void processImage();
private:
boost::numeric::ublas::matrix<double> imageToMatrix(const QImage& image);
QImage matrixToImage(const boost::numeric::ublas::matrix<double>& m);
QImage loadImage(const QString& imageFilePath);
};
#endif // IMAGEFILTER_HPP
<强> MainWindow.cpp 强>
#include "MainWindow.hpp"
#include <QPushButton>
#include <QHBoxLayout>
MainWindow::MainWindow(QWidget* parent)
: QMainWindow(parent), imageLabel(this) {
auto centralWidget = new QWidget(this);
imageLabel.setPixmap(QPixmap(QStringLiteral("lena.bmp")));
auto filterButton = new QPushButton(tr("Filter image"), this);
auto layout = new QVBoxLayout(centralWidget);
layout->addWidget(&imageLabel);
layout->addWidget(filterButton);
setCentralWidget(centralWidget);
connect(filterButton, &QPushButton::clicked,
this, &MainWindow::processImage);
}
void MainWindow::displayPixmap(const QPixmap& pixmap) {
imageLabel.setPixmap(pixmap);
}
<强> MainWindow.hpp 强>
#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP
#include <QMainWindow>
#include <QLabel>
#include <QWidget>
#include <QPixmap>
class MainWindow : public QMainWindow {
Q_OBJECT
public:
explicit MainWindow(QWidget* parent = nullptr);
signals:
void processImage();
public slots:
void displayPixmap(const QPixmap& pixmap);
private:
QLabel imageLabel;
};
#endif // MAINWINDOW_HPP
<强>的main.cpp 强>
#include "MainWindow.hpp"
#include "ImageFilter.hpp"
#include <QApplication>
#include <QObject>
int main(int argc, char* argv[]) {
QApplication app(argc, argv);
ImageFilter filter;
MainWindow window;
QObject::connect(&window, &MainWindow::processImage,
&filter, &ImageFilter::processImage);
QObject::connect(&filter, &ImageFilter::sendPixmap,
&window, &MainWindow::displayPixmap);
window.show();
return app.exec();
}