#include "mainwindow.h" #include "ui_mainwindow.h" #include <iostream> #include <QFileDialog> using namespace std; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->textBrowser->setFont( QFont("Times New Roman", 30) ); display_num = 0; QObject::connect( ui->textBrowser, SIGNAL(clicked()), this, SLOT(on_mytextBrowser_clicked()) ); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_openButton_clicked() { /*读入图片并显示,将图片以灰度形式读入*/ QString img_name = QFileDialog::getOpenFileName( this, "Open Image", "../dft", tr("Image Files(*.png *.jpg *.bmp *.jpeg)") ); src = imread( img_name.toAscii().data(), CV_LOAD_IMAGE_GRAYSCALE ); src.copyTo( src_1 ); // putText( src_1, "The original image:", Point(0, 50), 2, 1, Scalar::all(0), 2 ); imwrite( "../dft/src_1.jpg", src_1 ); ui->textBrowser->setFixedHeight( src.rows ); ui->textBrowser->setFixedWidth( src.cols ); ui->textBrowser->clear(); ui->textBrowser->append( "<img src=../dft/src_1.jpg>" ); display_num = 1; } void MainWindow::on_closeButton_clicked() { close(); } void MainWindow::on_mytextBrowser_clicked() { display_num ++; //扩展成为DFT最佳运算尺寸; Mat padded; int opw = getOptimalDFTSize( src.cols ); int oph = getOptimalDFTSize( src.rows ); copyMakeBorder( src, padded, 0, oph-src.rows, 0, opw-src.cols, BORDER_CONSTANT, Scalar::all(0) ); //为计算出的虚数增加1个通道 Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)}; Mat complexI; merge( planes, 2, complexI ); dft( complexI, complexI );//支持图像原地计算,调用opencv的dtf函数进行DFT计算 //得到赋值图像,取了对数 split( complexI, planes ); magnitude( planes[0], planes[1], planes[0] ); Mat log_img = planes[0]; log_img += Scalar::all(1); cv::log( log_img, log_img ); log_img = log_img(Rect(0, 0, log_img.cols & -2, log_img.rows & -2 )); //DFT结果 dst = log_img.clone(); cv::normalize( dst, dst, 0, 1, CV_MINMAX ); dst = 255.*dst; if( 1 == display_num ) { if( src.empty() ) { ui->textBrowser->setTextColor( Qt::red ); ui->textBrowser->append("Please open one image first!"); } else { ui->textBrowser->clear(); ui->textBrowser->append( "<img src =../dft/src_1.jpg>"); } } else if( 2 == display_num ) { /*7. 因为Qt中显示图片,如果图片类型为亮度图像,即其像素值为0~1之间,则显示出来的是全黑的图像。 *所以为了似图片显示正常,必须全部扩大255被,使之在0~255之间。当然了,如果是opencv自带的imshow()函数, *对于这样的值在0~1之间图像它会自动识别,并且有个术语称之为亮度图像。*/ dst.copyTo( dst_1 ); putText( dst_1, "DFT without rearranged image:", Point(0, 50), 3, 0.8, Scalar::all(0), 2 ); imwrite( "../dft/dst_1.jpg", dst_1 ); ui->textBrowser->clear(); ui->textBrowser->append( "<img src=../dft/dst_1.jpg>" ); } else if( 3 == display_num ) { display_num = 0;//原图,dft未调整图,dft调整图3幅图片进行轮流切换。 dst.copyTo( dst_2 ); int cx = dst_2.cols/2; int cy = dst_2.rows/2; Mat q0( dst_2, Rect(0, 0, cx, cy) ); Mat q1( dst_2, Rect(cx, 0, cx, cy) ); Mat q2( dst_2, Rect(0, cy, cx, cy) ); Mat q3( dst_2, Rect(cx, cy, cx, cy) ); Mat temp; //因为是共用数据的,所以下面的q0,q1,q2,q3的改变也会导致dst_2的改变。 q0.copyTo( temp ); q3.copyTo( q0 ); temp.copyTo( q3 ); q1.copyTo( temp ); q2.copyTo( q1 ); temp.copyTo( q2 ); putText( dst_2, "DFT with rearranged image", Point(0, 50), 1, 2, Scalar::all(0), 2, 8 ); imwrite( "../dft/dst_2.jpg", dst_2 ); ui->textBrowser->clear(); ui->textBrowser->append( "<img src=../dft/dst_2.jpg>" ); } } |
|