linux下实现图像金字塔+Qt5
学习内容:
- 搭建 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_RGB888Qimg = 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_RGB888Qimg1 = 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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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相关推荐
- qt程序在Linux下字体乱了,QT5程序字体渲染的问题
因为不断现代化的Linux系统再也无法调用infinality渲染包中的/etc/profile.d/infinality-settings.sh脚本,所以写在这个脚本里的系统字体全局参数已失效: X ...
- 第11章:图像金字塔
第11章:图像金字塔 一.理论基础: 1. 向下采样: 2. 向上采样: 二.pyrDown函数使用: 三.pyrUp函数及使用: 四.采样可逆性研究 五.拉普拉斯金字塔 1. 定义: 2. 应用: ...
- 2016年Linux下五个最佳视频编辑软件
概要: 在这篇文章中,Tiwo 讨论了 Linux 下最佳视频编辑器的优缺点和在基于 Ubuntu 的发行版中的安装方法. 在过去,我们已经在类似的文章中讨论了 Linux 下最佳图像管理应用软件,L ...
- Linux 下五个最佳视频编辑软件
概要: 在这篇文章中,Tiwo 讨论了 Linux 下最佳视频编辑器的优缺点和在基于 Ubuntu 的发行版中的安装方法. 在过去,我们已经在类似的文章中讨论了 Linux 下最佳图像管理应用软件,L ...
- openCV——图像金字塔
图像金字塔 理论基础 通常情况下,图像金字塔的底部是待处理的高分辨率图像(原始图像),而顶部则为其低 分辨率的近似图像.向金字塔的顶部移动时,图像的尺寸和分辨率都不断地降低.通常情况下, 每向上移动一 ...
- opencv 图像金字塔(python)
图像金字塔 图像金字塔 理论基础 下采样 上采样 pyrDown函数 pyrUp函数 采样可逆性的研究 拉普拉斯金字塔 图像金字塔 图像金字塔是由一幅图像的多个不同分辨率的子图所构成的图像集合 该组图 ...
- 我对图像金字塔的理解及OpenCV下的实现代码
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 图像金字塔算法表现出来的效果就是对图像进行缩放嘛 ...
- [Python图像处理] 二十一.图像金字塔之图像向下取样和向上取样
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...
- 上采样和下采样_OpenCV学习笔记(一)之图像金字塔-上采样与降采样与DOG
一. 图像金字塔 一个图像金字塔式一系列的图像组成,最底下的图形尺寸最大,最上方的图像尺寸最小. 高斯金字塔是从底向上,逐层降采样得到的. 高斯金字塔的生成过程分为两步: 对当前层进行高斯模糊. 删除 ...
最新文章
- NYOJ 585 取石子(六)
- Mach-O的动态链接相关知识
- 阿里云服务器部署SpringBoot项目(mysql安装、服务部署)
- 前端学习(3190):react简介二
- python 钉钉机器人发送图片_利用Python自动发送钉钉数据消息
- IXWebHosting主机如何退款中文图解教程
- 主动訪问用户数据的背后是品牌战略
- C++之printf格式
- html js 禁用浏览器上下滑动,原生javascript实现禁止浏览器滚动,滚动条不消失代码...
- java insert 返回主键_MyBatis中insert操作返回主键的实现方法 – java – www.cfei.net
- 详细推导波特图增益和相位曲线
- php 批量上传多个文件,小白浅析PHP中的单文件、多文件、批量上传
- spring cloud alibaba全家桶集合
- 不知道怎么去视频水印,看看这些怎样去水印教程
- 干货福利分享:pdf怎么去水印 如何在线去除PDF水印
- 操作系统第三次实验——线程基础总结
- 如何配置和测试ChatBot
- 教育:构造主义和机能主义
- 代号Gimmick Arch Linux 0.7.2发布
- 2021-2027全球与中国波本威士忌市场现状及未来发展趋势
热门文章
- 解决pdf.js预览pdf不显示签名问题(两条路)
- 洛谷P1312 [NOIP2011 提高组] Mayan 游戏 题解
- VB银行代扣代发工资系统的设计与实现
- CCNA(一)网络基础知识
- 加速度计和陀螺仪指南——数学模型和基本算法
- 对ajax中onreadystatechange事件执行流程的理解
- c语言图书管理系统代码
- 【IDEAEclipse快捷键对照表】
- MatConvNet配置详解,吐血整理Win10+MATLAB2019a+VS2015+cuda11.0
- 小程序 获取不到微信用户信息