分享

基础学习笔记之opencv(15):离散傅里叶变换

 mscdj 2014-07-02
复制代码
#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>" );
    }

}
复制代码

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约