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