學習内容:
- 搭建 Ubuntu開發環境
- 掌握c++ 基本文法
- Qt5運用
- 掌握圖像金字塔的原理
學習産出:
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
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL3UDOiR2NkVmY5EmZhlTZ4MDZ2QjM3IGOwgTOzkjY1YzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)