利用qt打开一张图片并转成灰度矩阵

首先是mat类,这个类的主要作用是构造一个容器,并将对应像素的灰度值放在容器内

#ifndef MAT_H
#define MAT_H

#include <vector>
#include <qimage.h>
#include <qstring.h>
class mat{
public:
    mat(){}
    mat(QImage &img):width(img.width()),
    height(img.height()),_img(img){}
    //构造函数,通过qt QImage类图片来完成mat类的初始化
    void filldata();
    //将QImage类图片内的数据转成灰度数据并附给mat类成员
    QString print();
    //将像素值转成Qstring对象,用于输出到label上
private:
    int width;
    int height;
    QImage _img;
    std::vector<int> data;
};



void mat::filldata()
{
    for(int i=0;i<width;i++)
    { for(int j=0;j<height;j++)
        {
          data.push_back(qGray(_img.pixel(i,j)));
          //最初在写这里的时候使用了Qrgb value =_img.pixel(i,j)
          //data.push_back(qGray(value)),但是这样导致了所有灰度值均为0;
          //目前还不知道原因
        }
    }
}

QString mat::print()
{
    mat::filldata();
    QString sdata;
    for(int i=0;i<width;i++)
    {
        for(int j=0;j<height;j++)
        {
          sdata =sdata+"  "+QString::number(data.at(i*height+j),10);
          //i*height+j,将height和width转为一列
        }
        sdata =sdata+'\n';
    }

    return sdata;
}
#endif

上面的mat类简单的实现了将qt图片转成类似matlab数据的功能。后续计划重载各种运算符,让这个mat类能实现更多矩阵的运算。

这是qmainwindow,也就是主界面,用于交互


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qstring.h"
#include "qfiledialog.h"
#include "qmessagebox.h"
#include "mat.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    QString filename;
    filename = QFileDialog::getOpenFileName(this,tr("choose image"),"",tr(""));
    if(filename.isEmpty())
    {
        return;
    }
    else
    {
        QImage* img = new QImage;
        if(!(img->load(filename)))
        {
            QMessageBox::information(this,tr("open image failed"),
                                     tr("open image failed"));
            delete img;
            return;
        }
'''
        ui->label->setScaledContents(true);
        //这句可以让图片自动适应label的尺寸
'''   
        ui->label->setPixmap(QPixmap::fromImage(*img));

        mat matrix(*img);
        ui->label->setText(matrix.print());
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2015-05-06 19:21  IronStark  阅读(1607)  评论(0编辑  收藏  举报