天天看點

linux下實作圖像金字塔+Qt5學習内容:學習産出:

學習内容:

  1. 搭建 Ubuntu開發環境
  2. 掌握c++ 基本文法
  3. Qt5運用
  4. 掌握圖像金字塔的原理

學習産出:

mainwindow.cpp

#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include "iostream"
#include <QDebug>
#include <QString>
using namespace std;
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <opencv2/imgcodecs.hpp> //imread、imwrite函數所在的頭檔案
#include <opencv2/highgui.hpp> //imshow、namedWindow、waitKey函數所在的頭檔案
#include <QFileDialog>//
#include <QMessageBox>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
Mat src;
Mat sec;
Mat nois;
Mat imgnios;

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

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

//打開原圖
void MainWindow::on_pushButton_clicked()
{
    QString filepath = QFileDialog::getOpenFileName(this, "打開檔案", "/home/kkk/桌面", "Picture(*.jpg,*.jpeg);所有檔案(*.*)");//打開圖檔
    ui->lineEdit->setText(filepath);
    FilePath = filepath;
    String matinmagepath = FilePath.toStdString();

    src=imread(matinmagepath, 1);
    nois = src;
    if(src.empty())
        return;
    cvtColor( src, src, CV_BGR2RGB );
    //将Mat轉為QImage  RGB圖: QImage::Format_RGB888
    Qimg = QImage( (const unsigned char*)(src.data), src.cols, src.rows, QImage::Format_RGB888 );
    //顯示圖檔
    ui->imagelabel->setPixmap( QPixmap::fromImage(Qimg));
    //調整合理尺寸
    ui->imagelabel->resize( ui->imagelabel->size());
    int height = src.rows;//row表示行,rows表示行的總數,即圖像的高
    int width = src.cols;//col表示列,cols表示列的總數,即圖像的寬
    QString widthnum = QString::number(width);
    QString heightnum = QString::number(height);
    ui->lineEdit_2->setText("x:"+widthnum);
    ui->lineEdit_3->setText("y:"+heightnum);

}

高斯變換上采樣金字塔
//void MainWindow::on_pushButton_2_clicked()
//{
//    String imageName = FilePath.toStdString();
//    Mat srcImage = imread(imageName, 1);
//     //進行向上取樣操作
//    Mat Up01;
//    Mat Up02;
//    Mat Up03;
//    pyrUp( srcImage, Up01, Size( srcImage.cols*2, srcImage.rows*2 ) );
//    pyrUp(  Up01, Up02, Size( Up01.cols*2,  Up01.rows*2 ) );
//    pyrUp(  Up02, Up03, Size(  Up02.cols*2,  Up02.rows*2 ) );
//    imshow("src",srcImage);
//    imshow("up_1",Up01);
//    imshow("up_2",Up02);
//    imshow("up_3",Up03);
    cvtColor( GaussionUp03, GaussionUp03, CV_BGR2RGB );
    //将Mat轉為QImage  RGB圖: QImage::Format_RGB888
    Qimg1 = QImage( (const unsigned char*)(GaussionUp03.data), GaussionUp03.cols, GaussionUp03.rows, QImage::Format_RGB888 );
    ui->imagelabel->setPixmap( QPixmap::fromImage(Qimg1));
    //調整合理尺寸
    ui->imagelabel_2->resize( ui->imagelabel_2->size());

//    //第一次上采樣圖檔像素值顯示
//    int height_1 = Up01.rows;//row表示行,rows表示行的總數,即圖像的高
//    int width_1 = Up01.cols;//col表示列,cols表示列的總數,即圖像的寬
//    QString widthnum_1 = QString::number(width_1);
//    QString heightnum_1 = QString::number(height_1);
//    ui->lineEdit_8->setText("x:"+widthnum_1);
//    ui->lineEdit_9->setText("y:"+heightnum_1);

//    //第二次上采樣圖檔像素值顯示
//    int height_2 = Up02.rows;//row表示行,rows表示行的總數,即圖像的高
//    int width_2 = Up02.cols;//col表示列,cols表示列的總數,即圖像的寬
//    QString widthnum_2 = QString::number(width_2);
//    QString heightnum_2 = QString::number(height_2);
//    ui->lineEdit_6->setText("x:"+widthnum_2);
//    ui->lineEdit_7->setText("y:"+heightnum_2);

//    //第三次上采樣圖檔像素值顯示
//    int height_3 = Up03.rows;//row表示行,rows表示行的總數,即圖像的高
//    int width_3 = Up03.cols;//col表示列,cols表示列的總數,即圖像的寬
//    QString widthnum_3 = QString::number(width_3);
//    QString heightnum_3 = QString::number(height_3);
//    ui->lineEdit_4->setText("x:"+widthnum_3);
//    ui->lineEdit_5->setText("y:"+heightnum_3);
//}



//高斯金字塔
void MainWindow::on_pushButton_3_clicked()
{
    //Mat dstImage;//臨時變量和目标圖的定義
    String imageName = FilePath.toStdString();
    Mat dsImage = imread(imageName, 1);
    Mat Down01;
    Mat Down02;
    Mat Down03;
    pyrDown( dsImage, Down01, Size( dsImage.cols/2, dsImage.rows/2 ) );
    pyrDown( Down01, Down02, Size( Down01.cols/2, Down01.rows/2 ) );
    pyrDown( Down02, Down03, Size( Down02.cols/2, Down02.rows/2 ) );
    imshow("src",dsImage);
    imshow("down_1",Down01);
    imshow("down_2",Down02);
    imshow("down_3",Down03);

    int height = src.rows;//row表示行,rows表示行的總數,即圖像的高
    int width = src.cols;//col表示列,cols表示列的總數,即圖像的寬
    QString widthnum = QString::number(width);
    QString heightnum = QString::number(height);
    ui->lineEdit_10->setText("x:"+widthnum);
    ui->lineEdit_11->setText("y:"+heightnum);

    //第一次下采樣圖檔像素值顯示
    int height_1 = Down01.rows;//row表示行,rows表示行的總數,即圖像的高
    int width_1 = Down01.cols;//col表示列,cols表示列的總數,即圖像的寬
    QString widthnum_1 = QString::number(width_1);
    QString heightnum_1 = QString::number(height_1);
    ui->lineEdit_4->setText("x:"+widthnum_1);
    ui->lineEdit_5->setText("y:"+heightnum_1);

    //第二次下采樣圖檔像素值顯示
    int height_2 = Down02.rows;//row表示行,rows表示行的總數,即圖像的高
    int width_2 = Down02.cols;//col表示列,cols表示列的總數,即圖像的寬
    QString widthnum_2 = QString::number(width_2);
    QString heightnum_2 = QString::number(height_2);
    ui->lineEdit_6->setText("x:"+widthnum_2);
    ui->lineEdit_7->setText("y:"+heightnum_2);

    //第三次下采樣圖檔像素值顯示
    int height_3 = Down03.rows;//row表示行,rows表示行的總數,即圖像的高
    int width_3 = Down03.cols;//col表示列,cols表示列的總數,即圖像的寬
    QString widthnum_3 = QString::number(width_3);
    QString heightnum_3 = QString::number(height_3);
    ui->lineEdit_8->setText("x:"+widthnum_3);
    ui->lineEdit_9->setText("y:"+heightnum_3);

}

//拉普拉斯金字塔
void MainWindow::on_bButton_clicked()
{
    String imageName = FilePath.toStdString();
    Mat dsImage = imread(imageName, 1);
    //Mat dstImage;臨時變量和目标圖的定義
    Mat LaplDown_1;
    Mat LaplDown_2;
    Mat LaplDown_3;
    Mat up_1;
    Mat down_1;
    Mat up_2;
    Mat down_2;
    Mat up_3;
    Mat down_3;
    //拉普拉斯金字塔第0層
    pyrDown( dsImage, down_1, Size( dsImage.cols/2, dsImage.rows/2 ) );
    pyrUp( down_1, up_1, Size( down_1.cols*2, down_1.rows*2 ) );
    absdiff(dsImage, up_1, LaplDown_1);
    imshow("l_0",LaplDown_1);
    //拉普拉斯金字塔第1層
    pyrDown( down_1, down_2, Size( down_1.cols/2, down_1.rows/2 ) );
    pyrUp( down_2, up_2, Size( down_2.cols*2, down_2.rows*2 ) );
    absdiff(down_1, up_2, LaplDown_2);
    imshow("l_1",LaplDown_2);
    //拉普拉斯金字塔第2層
    pyrDown( down_2, down_3, Size( down_2.cols/2, down_2.rows/2 ) );
    pyrUp( down_3, up_3, Size( down_3.cols*2, down_3.rows*2 ) );
    absdiff(down_2, up_3, LaplDown_3);
    imshow("l_2",LaplDown_3);

    int height_1 = LaplDown_1.rows;//row表示行,rows表示行的總數,即圖像的高
    int width_1 = LaplDown_1.cols;//col表示列,cols表示列的總數,即圖像的寬
    QString widthnum_1 = QString::number(width_1);
    QString heightnum_1 = QString::number(height_1);
    ui->lineEdit_18->setText("x:"+widthnum_1);
    ui->lineEdit_19->setText("y:"+heightnum_1);


    int height_2 = LaplDown_2.rows;//row表示行,rows表示行的總數,即圖像的高
    int width_2 = LaplDown_2.cols;//col表示列,cols表示列的總數,即圖像的寬
    QString widthnum_2 = QString::number(width_2);
    QString heightnum_2 = QString::number(height_2);
    ui->lineEdit_16->setText("x:"+widthnum_2);
    ui->lineEdit_13->setText("y:"+heightnum_2);

    int height_3 = LaplDown_3.rows;//row表示行,rows表示行的總數,即圖像的高
    int width_3 = LaplDown_3.cols;//col表示列,cols表示列的總數,即圖像的寬
    QString widthnum_3 = QString::number(width_3);
    QString heightnum_3 = QString::number(height_3);
    ui->lineEdit_12->setText("x:"+widthnum_3);
    ui->lineEdit_17->setText("y:"+heightnum_3);
}

//用拉普拉斯圖像恢複高斯金字塔圖檔的高頻資訊
void MainWindow::on_bButton_2_clicked()
{
    Mat G_0;
    Mat LaplDown_1;
    Mat up_1;
    Mat down_1;
    String imageName = FilePath.toStdString();
    Mat dsImage = imread(imageName, 1);

    pyrDown( dsImage, down_1, Size( dsImage.cols/2, dsImage.rows/2 ) );
    pyrUp( down_1, up_1, Size( down_1.cols*2, down_1.rows*2 ) );
    absdiff(dsImage, up_1, LaplDown_1);

    add(up_1,LaplDown_1,G_0);
    imshow("re_src",G_0);
    imshow("src",dsImage);
    imshow("doup_1",up_1);
    imshow("lap_1",LaplDown_1);

}
           

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/types_c.h>


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
void switchPage();
void switchcore();
//void saltAndPepper();
   QString FilePath;

private slots:
   void on_pushButton_clicked();
   void on_pushButton_3_clicked();
   void on_bButton_clicked();
   void on_bButton_2_clicked();

private:
    Ui::MainWindow *ui;
    QImage Qimg;//原圖
    QString filename;
};
#endif // MAINWINDOW_H
           

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(tet LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Find OpenCV, you may need to set OpenCV_DIR variable
# to the absolute path to the directory containing OpenCVConfig.cmake file
# via the command line or GUI
find_package(OpenCV 4.6.0 REQUIRED)
find_package(Qt5 COMPONENTS Widgets REQUIRED)
# If the package has been found, several variables will
# be set, you can find the full list with descriptions
# in the OpenCVConfig.cmake file.
# Print some message showing some of them
message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")

# Add OpenCV headers location to your include paths
include_directories(${OpenCV_INCLUDE_DIRS})

# Declare the executable target built from your sources
add_executable(tet main.cpp mainwindow.cpp mainwindow.h mainwindow.ui)

# Link your application with OpenCV libraries
target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Gui Qt5::Widgets ${OpenCV_LIBS})
           

mainwindow.ui

linux下實作圖像金字塔+Qt5學習内容:學習産出: