高斯滤波程序编写 opencv C++ CSU

  • C++ vs2017 opencv
  • 实验1 高斯滤波程序编写 CSU
    • 一、 实验目的
    • 二、实验内容与要求
  • 三、正文
    • 3.1设计思路
    • 3.2代码及其属性
    • 3.3主要代码:
      • 3.3.1文件: < zrxCImgPro.h >
      • 3.3.2文件: < zrxCImgPro.cpp >
      • 3.3.3文件: < ZRX0107170110Dlg.cpp > (只摘取部分)
    • 3.4运行结果
      • 3.4.1界面
      • 3.4.2灰度图像
      • 3.4.3 二通道图像
      • 3.4.4 自写Gauss滤波图像
      • 3.4.5 Opencv 自带Gauss图像
      • 3.4.6 自写Gauss滤波图像与Opencv自带Gauss图像对比
      • 3.4.7 帮助按钮
  • 代码虽多不要贪杯~

C++ vs2017 opencv

实验1 高斯滤波程序编写 CSU

一、 实验目的

  • 掌握OpenCV配置;
  • 掌握OpenCV彩色图像和灰度图像的读写操作;
  • 读懂阈值分割程序;
  • 实现高斯滤波,掌握图像的操作

二、实验内容与要求

编写Gauss滤波程序。
步骤:

(1) 由nwiddowsize 计算gauss滤波器空间

(2) 按照高斯公式计算计算滤波器(具体参考PPT)

(3) 利用上步高斯滤波器进行卷积,实现滤波过程。

三、正文

3.1设计思路

3.2代码及其属性

按钮ID CADPTION 对应函数
IDOK 打开并显示灰度图像 OnBnClickedOk()
IDC_read2 二值化图像 OnBnClickedread2()
IDC_read3 Guass滤波/opencv的Guass滤波图像 OnBnClickedread3()
IDC_read4 帮助 OnBnClickedread4()
IDCANCEL 取消

3.3主要代码:

3.3.1文件: < zrxCImgPro.h >

/***************************************************************************
类:zrxCImgPro
作用:封装图像操作函数,按钮操作功能也存储在其内 使用了opencv4.1.1
Welcome to my Github and my CSDN blog , more information will be available about the project!
Github:https://github.com/Yiqingde
CSDN Blog:https://me.csdn.net/weixin_42348202
历史:**日期**         **理由**            **签名**2019年9月20日        创建              ***
/**************************************************************************/
#pragma once
#include <opencv2/opencv.hpp>
#include <string>
#include <vector>
using namespace cv;
using namespace std;
class zrxCImgPro
{private:Mat m_srcimg;//原始灰度图像bool tag;//鲁棒性void BinaryImage(Mat Ori, const int binaryT, Mat &binary);//将原始灰度图像转化为二进制图像         void CreateGauss(const int nwiddowsize, const float sigma, Mat &Gauss);//高斯卷积核void Gaussianfilter(const Mat srcImg, const int nwiddowsize, const float sigma, Mat &dstImg);//高斯滤波函数 需要调用以上函数:高斯滤波卷积核函数
public:zrxCImgPro();~zrxCImgPro();void OpenImg();//实现按钮功能,打开图像void Button_binaryImg();//实现按钮功能,显示二值图像void Button_GaussImg();//实现按钮功能,包括显示自写与opencv的gauss图像,并显示运行时间void Button_Help(); //实现按钮功能,help
};

3.3.2文件: < zrxCImgPro.cpp >

#include "stdafx.h"
#include "zrxCImgPro.h"
zrxCImgPro::zrxCImgPro()
{this->tag = 0;//起始置0
}
zrxCImgPro::~zrxCImgPro()
{}/***************************************************************************
函数:BinaryImage(Mat Ori, const int binaryT, Mat &binary)
作用:将原始灰度图像转化为二进制图像
参数:Mat Ori 原始图像const int binaryT  阈值Mat &binary  二进制图像
返回值:无
历史:**日期**         **理由**            **签名**                     2019年9月20日        创建              ***
/**************************************************************************/
void zrxCImgPro::BinaryImage(Mat Ori, const int binaryT, Mat &binary)
{//影像初始化binary.create(Ori.rows, Ori.cols, Ori.type());//循环带走for (int i = 0; i < Ori.rows; i++){for (int j = 0; j < Ori.cols; j++){int tmp = Ori.at<uchar>(i, j);(tmp > binaryT) ? binary.at<uchar>(i, j) = 255 : binary.at<uchar>(i, j) = 0;}}
}/***************************************************************************
函数:CreateGauss(const int nwiddowsize, const float sigma, Mat &Gauss)
作用:高斯卷积核
参数:const int nwiddowsize 卷积核窗口宽度或长度const float sigma  就是sigmaMat &Gauss  大小为nwiddowsize*nwiddowsize的卷积阵
返回值:无
历史:**日期**         **理由**            **签名**2019年9月20日        创建              ***
/**************************************************************************/
void zrxCImgPro::CreateGauss(const int nwiddowsize, const float sigma, Mat &Gauss)
{Gauss.create(nwiddowsize, nwiddowsize, CV_32FC1);int center = (nwiddowsize + 1) / 2;const float PI = 4 * tan(1.0);float sum = 0;//计算权阵//给Mat复制for (int i = 0; i < nwiddowsize; i++){for (int j = 0; j < nwiddowsize; j++){float radius = ((i + 1 - center)*(i + 1 - center) + (j + 1 - center)*(j + 1 - center));float temp1 = (1 / (2 * PI *sigma*sigma))* exp(-(radius / (2 * sigma*sigma)));Gauss.at<float>(i, j) = temp1;sum += Gauss.at<float>(i, j);}}for (int i = 0; i < nwiddowsize; i++){for (int j = 0; j < nwiddowsize; j++){Gauss.at<float>(i, j) = Gauss.at<float>(i, j) / (sum + 1e-6);}}
}/***************************************************************************
函数:Gaussianfilter(const Mat srcImg, const int nwiddowsize, const float sigma, Mat &dstImg)
作用:高斯滤波函数 需要调用以上函数:高斯滤波卷积核函数
参数:const Mat srcImg 原始灰度图像const int nwiddowsize 卷积核窗口宽度或长度const float sigma 就是sigmaMat &dstImg 返回经经卷积后的图像
返回值:无
历史:**日期**         **理由**            **签名**2019年9月20日        创建              ***
/**************************************************************************/
void zrxCImgPro::Gaussianfilter(const Mat srcImg, const int nwiddowsize, const float sigma, Mat &dstImg)
{double t = srcImg.rows;dstImg.create(srcImg.rows, srcImg.cols, CV_32FC1);Mat Gauss;CreateGauss(nwiddowsize, sigma, Gauss);for (int i = 2; i < srcImg.rows - 3; i++){for (int j = 2; j < srcImg.cols - 3; j++){Mat temp1;temp1.create(nwiddowsize, nwiddowsize, CV_32FC1);temp1 = srcImg(Range(i - 2, i + 3), Range(j - 2, j + 3));Mat temp2;temp1.convertTo(temp2, CV_32FC1);dstImg.at<float>(i, j) = temp2.dot(Gauss);}}dstImg.convertTo(dstImg, CV_8UC1);
}/***************************************************************************
函数:OpenImg()
作用:实现按钮功能,打开图像并显示灰度图像,存储到 m_srcimg中; tag是标签、增加程序鲁棒性
参数:无
返回值:无
历史:**日期**         **理由**            **签名**2019年9月20日        创建              ***
/**************************************************************************/
void zrxCImgPro::OpenImg()
{CFileDialog FileDlg(TRUE, "*.jpg;*.bmp", "*.jpg;*.bmp", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "影像文件()");if (FileDlg.DoModal() != IDOK){return;}CString strImgName = FileDlg.GetPathName();//打开影像 //IMREAD_GRAYSCALE  以灰度形式打开m_srcimg = imread(strImgName.GetBuffer(), IMREAD_GRAYSCALE);resize(m_srcimg, m_srcimg, Size(m_srcimg.cols * 800 / m_srcimg.rows, 800), 0, 0, INTER_CUBIC);imshow("原始灰度图像", m_srcimg); //显示//waitKey(); //等待操作,将窗口关闭\回车\ESC等操作会运行以下的程序tag = 1;
}/***************************************************************************
函数:Button_binaryImg()
作用:实现按钮功能,显示二值图像
参数:无
返回值:无
历史:**日期**         **理由**            **签名**2019年9月20日        创建              ***
/**************************************************************************/
void zrxCImgPro::Button_binaryImg()
{if (tag == 0){AfxMessageBox(_T("需首先打开影像才能进行操作!"));return ;}//二值化操作Mat m_binary;BinaryImage(m_srcimg, 100, m_binary);imshow("图像二值化结果", m_binary); //显示waitKey();
}/***************************************************************************
函数:Button_GaussImg()
作用:实现按钮功能,包括显示自写与opencv的gauss图像,并显示运行时间
参数:无
返回值:无
历史:**日期**         **理由**            **签名**2019年9月20日        创建              ***
/**************************************************************************/
void zrxCImgPro::Button_GaussImg()
{if (tag == 0){AfxMessageBox(_T("需首先打开影像才能进行操作!"));return;}Mat distImg;clock_t start, finish;double totaltime;clock_t start1, finish1;double totaltime1;start = clock();Gaussianfilter(m_srcimg, 5, 1.0, distImg);//namedWindow("ss", 1);imshow("高斯滤波结果", distImg); //显示finish = clock();totaltime = (double)(finish - start) / CLOCKS_PER_SEC;waitKey(100); //等待操作,将窗口关闭\回车\ESC等操作会运行以下的程序//opencv自带高斯滤波Mat dstImage;start1 = clock();GaussianBlur(m_srcimg, dstImage, Size(5, 5), 0, 0);//显示效果图imshow("opencv自带高斯滤波效果图", dstImage);finish1 = clock();totaltime1 = (double)(finish1 - start1) / CLOCKS_PER_SEC;waitKey(3000);CString runtime;runtime.Format("%s%f%s\r\n%s%f%s",_T("自写Gauss滤波运行时间:"), totaltime,_T("s"),_T("opencvGauss滤波运行时间:"),totaltime1,_T("s"));AfxMessageBox(runtime);}/***************************************************************************
函数:Button_Help()
作用:实现按钮功能,help
参数:无
返回值:无
历史:**日期**         **理由**            **签名**2019年9月20日        创建              ***
/**************************************************************************/
void zrxCImgPro::Button_Help()
{CString help;help.Format("%s\r\n%s\r\n%s\r\n\r\n%s\r\n%s\r\n%s\r\n" ,_T("感谢您使用本程序!提示:"), _T("需首先打开影像才能进行操作!"),_T("自写Gauss滤波代码运行较慢,请耐心等待!"),_T("Welcome to my Github and my CSDN blog , more information will be available about the project!"),_T("Github : https://github.com/Yiqingde"),_T("CSDN Blog : https://me.csdn.net/weixin_42348202"));AfxMessageBox(help);
}

3.3.3文件: < ZRX0107170110Dlg.cpp > (只摘取部分)

/***************************************************************************
类:ZRX0107170110Dlg
作用:按钮实现文件
历史:**日期**         **理由**            **签名**2019年9月20日        创建              ***
/**************************************************************************/
……
zrxCImgPro t;//全局变量
/*************************************************
按钮:读取图像函数
*************************************************/
void CZRX0107170110Dlg::OnBnClickedOk()
{// TODO: 在此添加控件通知处理程序代码//CDialogEx::OnOK();t.OpenImg();
}
/*************************************************
按钮:进行二值化显示
*************************************************/
void CZRX0107170110Dlg::OnBnClickedread2()
{// TODO: 在此添加控件通知处理程序代码t.Button_binaryImg();
}
/*************************************************
按钮:进行自写gauss显示与opencv显示且比较时间
*************************************************/
void CZRX0107170110Dlg::OnBnClickedread3()
{// TODO: 在此添加控件通知处理程序代码t.Button_GaussImg();
}
/*************************************************
按钮:help
*************************************************/
void CZRX0107170110Dlg::OnBnClickedread4()
{// TODO: 在此添加控件通知处理程序代码t.Button_Help();
}

3.4运行结果

3.4.1界面

3.4.2灰度图像

3.4.3 二通道图像

3.4.4 自写Gauss滤波图像

3.4.5 Opencv 自带Gauss图像

3.4.6 自写Gauss滤波图像与Opencv自带Gauss图像对比

3.4.7 帮助按钮

代码虽多不要贪杯~

高斯滤波程序编写 opencv C++ CSU相关推荐

  1. python opencv高斯滤波_【OpenCV】基于Python的图像高斯平滑和椒盐噪声处理 | 学步园...

    最近要做一个Project,是使用TV来对添加了Gaussian和Salt&Pepper噪声的图像进行恢复,前期的任务是生成噪声污染的图像. 噪声图像的生成采用对图像进行高斯平滑,之后在随机的 ...

  2. 【图像处理】——图像滤波(Python+opencv实现三种方法:均值滤波、中值滤波、高斯滤波等)

    目录 一.什么是滤波以及滤波的目的? 二.均值滤波(cv2.blur()) 1.原理 2.关键代码 3.封装代码 二.中值滤波(cv2.medianBlur()) 1.原理 2.关键代码 3.封装代码 ...

  3. 高斯滤波详解 python实现高斯滤波

    一. 高斯滤波 高斯滤波是一种线性平滑滤波器,对于服从正态分布的噪声有很好的抑制作用.在实际场景中,我们通常会假定图像包含的噪声为高斯白噪声,所以在许多实际应用的预处理部分,都会采用高斯滤波抑制噪声. ...

  4. python设计---空域增强之图片去噪(中值滤波、均值滤波、高斯滤波、双边滤波)

    空域增强之图片去噪 引言 中值滤波及均值滤波 中值滤波 理论方法 均值滤波 中值滤波和均值滤波的对比 程序 高斯滤波 程序 双边滤波 程序 ui界面 设计程序 后续 引言 我们在日常工作生活中,总是需 ...

  5. 【OpenCV 4开发详解】高斯滤波

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  6. (图像处理之滤波)OpenCV实现频率域的低通高斯滤波(C++)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/weixin_40647819/art ...

  7. 《OpenCv视觉之眼》Python图像处理五 :Opencv图像去噪处理之均值滤波、方框滤波、中值滤波和高斯滤波

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  8. OpenCV调用摄像头+灰度图+高斯滤波+Canny算子

    来把opencv经常要用的一些函数来梳理一下 效果图震楼 惯例opencv配置环境地址:https://blog.csdn.net/aidam_bo/article/details/81132918 ...

  9. 用opencv打开一个视频并加特效(灰度转换、高斯滤波、canny边缘检测处理)再保存

    做这个代码时只在保存转化后的视频时出现了问题,就是保存的avi文件打不开,并且大小很小(所以我怀疑没有写进去) 导致出错的代码 VideoWriter writer("qinshi3.avi ...

  10. OpenCV图像模糊:高斯滤波、双边滤波

    一.高斯模糊 1.高斯滤波原理 图像处理中,高斯滤波主要可以使用两种方法实现.一种是离散化窗口滑窗卷积,另一种方法是通过傅里叶变化.离散化窗口划船卷积时主要利用的是高斯核,高斯核的大小为奇数,因为高斯 ...

最新文章

  1. 互联网协议 — OSPF 开放式最短路径优先协议
  2. Nmap在pentest box中的扫描及应用
  3. JavaScript如何中断循环执行?
  4. 计算机考研各个学校科目,计算机考研学校的前几个排名
  5. mariadb中文手册_MariaDB性能调优工具mytop的使用详解
  6. mysql行级锁升级_mysql innodb 行级锁升级
  7. python交互式怎么保存_如何保存Python交互式会话?
  8. Linux下的MySQL主主复制
  9. python画柱状图-python使用matplotlib画柱状图、散点图
  10. 【转】缺少servlet-api.jar包
  11. C语言的32个关键字和9种控制语句
  12. 不动产 - 权属性质代码
  13. 软考中级哪一门比较好过?我建议你考这个。
  14. 40 个科研学术网站,赶紧来收藏一波!
  15. Panel面板和三种布局管理器
  16. Python Appium自动化测试 连接模拟器启动淘宝APP
  17. 如何网络推广快,怎么快速推广网站
  18. 计算机科学论文写作5-写硕士论文
  19. Bat 批处理之 for/f 详解
  20. iOS-OC-自定义融云IM聊天界面,键盘收回去输入工具栏下去

热门文章

  1. compose yaml规则
  2. 赣州计算机教师招聘,江西省赣州市章贡区2019年招聘教师人员岗位表
  3. Error: Invalid or corrupt
  4. MapReduce job任务源码提交流程
  5. matlab电气常用工具箱,matlab电气工具箱实验指导书
  6. python字典的基本操作编程_Python入门教程5. 字典基本操作【定义、运算、常用函数】 原创...
  7. python image 转成字节_Python 办公自动化之 Excel(下)
  8. Cesium:去除原生自带绿色选择框
  9. 非线性优化_曲线拟合_g2o图优化_最小二乘优化示例
  10. python-Error Message: 'float' object cannot be interpreted as an integer