Увеличить матрицу к изображению

0

Я использую 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". Теперь я хотел бы отобразить эту матрицу, поскольку изображение есть где-то, что я могу сделать это?

заранее спасибо

Теги:
qt
matrix
boost

1 ответ

0
Лучший ответ

Вот пример, который преобразует вашу матрицу Boost обратно в QImage после ее фильтрации. Он преобразует QImage в QPixmap, который затем отображается с QLabel. Я отделил вашу логику и графический интерфейс, поставив ваш код фильтрации изображений в отдельный класс.

Он использует возможности С++ 11, поэтому вам нужно будет определить С++ 11 с вашей системой сборки. Если вы используете Qt Creator, добавьте CONFIG + = С++ 11 в ваш.pro файл.

ImageFilter.cpp

#include "ImageFilter.hpp"
#include <QPixmap>

ImageFilter::ImageFilter(QObject* parent) : QObject(parent)
{}

void ImageFilter::processImage()
{
  auto image = loadImage("lena.bmp");

  auto matrix = imageToMatrix(image);

  // Apply filters to matrix

  auto filteredImage = matrixToImage(matrix);

  auto filteredPixmap = QPixmap::fromImage(filteredImage);

  emit sendPixmap(filteredPixmap);
}

boost::numeric::ublas::matrix<double> ImageFilter::imageToMatrix(const QImage& image)
{
  auto width = image.width();
  auto height = image.height();

  boost::numeric::ublas::matrix<double> m{width, height};

  for (auto i = 0; i < m.size1(); ++i)
  {
    for (auto 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)
{
  auto image = QImage{static_cast<int>(m.size1()),
                      static_cast<int>(m.size2()),
                      QImage::Format_RGB32};

  for (auto i = 0; i < m.size1(); ++i)
  {
    for (auto 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)
{
  auto pixmap = QPixmap{imageFilePath};

  pixmap = pixmap.copy(512, 512, 128, 128);
  pixmap = pixmap.scaled(128, 128);

  const auto image = pixmap.toImage();

  return image;
}

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)
{
  auto centralWidget = new QWidget{this};

  imageLabel = new QLabel{this};
  imageLabel->setPixmap(QPixmap{"lena.bmp"});

  auto filterButton = new QPushButton{"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();
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню