将矩阵提升为图像

时间:2014-08-21 08:16:54

标签: c++ qt boost matrix

我正在使用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'现在我想显示这个矩阵,因为图像是否存在我可以做到这一点?

提前致谢

1 个答案:

答案 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();
}