文章目录

  • 前言
  • 一、高斯高通滤波器(GHPF)
  • 二、代码

前言

数字图像处理c++ opencv(VS2019 opencv4.53)持续更新


一、高斯高通滤波器(GHPF)

D 2 ( u , v ) 为 距 离 中 心 点 的 距 离 平 方 , D 0 为 设 置 半 径 D^2(u,v)为距离中心点的距离平方,D_0为设置半径 D2(u,v)为距离中心点的距离平方,D0​为设置半径


二、代码

主代码:

#include<iostream>
#include<opencv2/opencv.hpp>
#include "MY_DFT.h"using namespace cv;
using namespace std;int main()
{Mat image, image_gray, image_output, image_transform;   //定义输入图像,灰度图像,输出图像image = imread("lena.png");  //读取图像;if (image.empty()){cout << "读取错误" << endl;return -1;}imshow("image", image);cvtColor(image, image_gray, COLOR_BGR2GRAY); //转换为灰度图imshow("image_gray", image_gray); //显示灰度图//1、傅里叶变换,image_output为可显示的频谱图,image_transform为傅里叶变换的复数结果My_DFT(image_gray, image_output, image_transform);imshow("image_output", image_output);//2、高斯高通滤波Mat planes[] = { Mat_<float>(image_output), Mat::zeros(image_output.size(),CV_32F) };split(image_transform, planes);//分离通道,获取实部虚部Mat image_transform_real = planes[0];Mat image_transform_imag = planes[1];int core_x = image_transform_real.rows / 2;//频谱图中心坐标int core_y = image_transform_real.cols / 2;int r = 20;  //滤波半径float h;for (int i = 0; i < image_transform_real.rows; i++){for (int j = 0; j < image_transform_real.cols; j++){h = 1 - exp(-((i - core_x) * (i - core_x) + (j - core_y) * (j - core_y)) / (2 * r * r));image_transform_real.at<float>(i, j) = image_transform_real.at<float>(i, j) * h;image_transform_imag.at<float>(i, j) = image_transform_imag.at<float>(i, j) * h;}}planes[0] = image_transform_real;planes[1] = image_transform_imag;Mat image_transform_ilpf;//定义高斯高通滤波结果merge(planes, 2, image_transform_ilpf);//3、傅里叶逆变换Mat iDft[] = { Mat_<float>(image_output), Mat::zeros(image_output.size(),CV_32F) };idft(image_transform_ilpf, image_transform_ilpf);//傅立叶逆变换split(image_transform_ilpf, iDft);//分离通道,主要获取0通道magnitude(iDft[0], iDft[1], iDft[0]); //计算复数的幅值,保存在iDft[0]normalize(iDft[0], iDft[0], 0, 1, NORM_MINMAX);//归一化处理imshow("idft", iDft[0]);//显示逆变换图像waitKey(0);  //暂停,保持图像显示,等待按键结束return 0;
}

傅里叶变换代码(.h文件):

#pragma once
#include<iostream>
#include<opencv2/opencv.hpp>
#include<cmath>using namespace cv;
using namespace std;void My_DFT(Mat input_image, Mat& output_image, Mat& transform_array);

傅里叶变换代码(.cpp文件):

#include "MY_DFT.h"//傅里叶变换得到频谱图和复数域结果
void My_DFT(Mat input_image, Mat& output_image, Mat& transform_image)
{//1.扩展图像矩阵,为2,3,5的倍数时运算速度快int m = getOptimalDFTSize(input_image.rows);int n = getOptimalDFTSize(input_image.cols);copyMakeBorder(input_image, input_image, 0, m - input_image.rows, 0, n - input_image.cols, BORDER_CONSTANT, Scalar::all(0));//2.创建一个双通道矩阵planes,用来储存复数的实部与虚部Mat planes[] = { Mat_<float>(input_image), Mat::zeros(input_image.size(), CV_32F) };//3.从多个单通道数组中创建一个多通道数组:transform_image。函数Merge将几个数组合并为一个多通道阵列,即输出数组的每个元素将是输入数组元素的级联merge(planes, 2, transform_image);//4.进行傅立叶变换dft(transform_image, transform_image);//5.计算复数的幅值,保存在output_image(频谱图)split(transform_image, planes); // 将双通道分为两个单通道,一个表示实部,一个表示虚部Mat transform_image_real = planes[0];Mat transform_image_imag = planes[1];magnitude(planes[0], planes[1], output_image); //计算复数的幅值,保存在output_image(频谱图)//6.前面得到的频谱图数级过大,不好显示,因此转换output_image += Scalar(1);   // 取对数前将所有的像素都加1,防止log0log(output_image, output_image);   // 取对数normalize(output_image, output_image, 0, 1, NORM_MINMAX); //归一化//7.剪切和重分布幅度图像限output_image = output_image(Rect(0, 0, output_image.cols & -2, output_image.rows & -2));// 重新排列傅里叶图像中的象限,使原点位于图像中心int cx = output_image.cols / 2;int cy = output_image.rows / 2;Mat q0(output_image, Rect(0, 0, cx, cy));   // 左上区域Mat q1(output_image, Rect(cx, 0, cx, cy));  // 右上区域Mat q2(output_image, Rect(0, cy, cx, cy));  // 左下区域Mat q3(output_image, Rect(cx, cy, cx, cy)); // 右下区域//交换象限中心化Mat tmp;q0.copyTo(tmp); q3.copyTo(q0); tmp.copyTo(q3);//左上与右下进行交换q1.copyTo(tmp); q2.copyTo(q1); tmp.copyTo(q2);//右上与左下进行交换Mat q00(transform_image_real, Rect(0, 0, cx, cy));   // 左上区域Mat q01(transform_image_real, Rect(cx, 0, cx, cy));  // 右上区域Mat q02(transform_image_real, Rect(0, cy, cx, cy));  // 左下区域Mat q03(transform_image_real, Rect(cx, cy, cx, cy)); // 右下区域q00.copyTo(tmp); q03.copyTo(q00); tmp.copyTo(q03);//左上与右下进行交换q01.copyTo(tmp); q02.copyTo(q01); tmp.copyTo(q02);//右上与左下进行交换Mat q10(transform_image_imag, Rect(0, 0, cx, cy));   // 左上区域Mat q11(transform_image_imag, Rect(cx, 0, cx, cy));  // 右上区域Mat q12(transform_image_imag, Rect(0, cy, cx, cy));  // 左下区域Mat q13(transform_image_imag, Rect(cx, cy, cx, cy)); // 右下区域q10.copyTo(tmp); q13.copyTo(q10); tmp.copyTo(q13);//左上与右下进行交换q11.copyTo(tmp); q12.copyTo(q11); tmp.copyTo(q12);//右上与左下进行交换planes[0] = transform_image_real;planes[1] = transform_image_imag;merge(planes, 2, transform_image);//将傅里叶变换结果中心化
}

结果:

c++ opencv数字图像处理:频率域滤波--高通滤波--高斯高通滤波相关推荐

  1. 数字图像处理-频率域滤波原理

    from:https://blog.csdn.net/forrest02/article/details/55510711?locationNum=15&fps=1 写在前面的话 作者是一名在 ...

  2. 数字图像处理-频率域滤波

    一.实验原理 频率域滤波是对图像进行傅里叶变换,将图像由图像空间转换到频域空间,然后在频率域中对图像的频谱作分析处理,以改变图像的频率特征,原理是用傅里叶变换表示的函数特征完全可以通过傅里叶反变换来重 ...

  3. OpenCV实现频率域滤波——以高斯低通滤波去噪为例

    最近由于作业原因,试着用OpenCV实现频率域滤波,但是OpenCV中并没有像MATLAB中fftshift这样的中心化操作,所以我写了一个频率域滤波的函数,以后用频率域滤波的时候在主函数中调用即可. ...

  4. (十一)OpenCV实现图像频率域滤波

    1.基础 见<数字图像处理第四版>P137-P209 1.1傅里叶变换Fourier Transform Fourier Transform由法国的一位数学家和物理学家Jean-Bapti ...

  5. 数字图像处理 频率域锐化 MATLAB实验

    一.原理_频率域锐化 理想高通滤波器的传递函数为: n 阶巴特沃斯高通滤波器的传递函数为: n 阶指数高通滤波器的传递函数为: 二.步骤 (1)读入原图像test.tif并显示: (2)采用理想高通滤 ...

  6. 数字图像处理 频率域平滑 MATLAB实验

    一.原理_频率域平滑 理想低通滤波器的传递函数为: n 阶巴特沃斯低通滤波器的传递函数为: n 阶指数低通滤波器的传递函数为: 二.步骤 (1)读入原图像test.tif并显示: (2)对原图像添加高 ...

  7. OpenCV —— 频率域滤波(傅里叶变换,低通和高通滤波,带通和带阻滤波,同态滤波)

    频率域滤波 基本概念 傅里叶变换 二维离散的傅里叶变换 快速傅里叶变换 傅里叶幅度谱与相位谱 谱残差显著性检测 卷积与傅里叶变换的 频率域滤波 低通滤波和高通滤波 带通和带阻滤波 同态滤波 基本概念 ...

  8. 数字图像处理学习笔记5:频率域滤波1(傅里叶频谱图,低通滤波-平滑,高通滤波-锐化)

    文章目录 前言 一.傅里叶变换:傅里叶频谱图 二.低通滤波 1.理想低通滤波 2.布特沃斯低通滤波 3.高斯低通滤波 4.小结 三.高通滤波 1.理想高通滤波 2.布特沃斯高通滤波 3.高斯高通滤波 ...

  9. 数字图像处理——第四章 频率域滤波

    数字图像处理--第4章 频率域滤波 文章目录 数字图像处理--第4章 频率域滤波 频率域 1.傅里叶级数原理 1.1.一维傅里叶变换 1.2.二维傅里叶变换 2.python×傅里叶级数 2.1.傅里 ...

  10. 【OpenCV 例程200篇】86. 频率域滤波应用:指纹图像处理

    [OpenCV 例程200篇]86. 频率域滤波应用:指纹图像处理 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 4 ...

最新文章

  1. mysql 存储过程怎么多行注释_数据库通过存储过程批量添加注释(模板为oracle)...
  2. for语句联系 -小九九乘法表
  3. 第一个Mybatis程序示例 Mybatis简介(一)
  4. hello this Word ! I'm coming!
  5. 概念的图解 —— 数学
  6. SAP Hybris Commerce里类似ABAP里的透明表设计
  7. wait( )和 waitpid( )
  8. Manasa and Combinatorics
  9. (转)shiro权限框架详解03-shiro介绍
  10. 手工给alv添加合计
  11. php抓住教务处课表详细教程,php实现模拟登陆方正教务系统抓取课表
  12. python爬取cnnvd,粘贴可用
  13. reboot流程简述
  14. Ubuntu查询MAC地址,硬盘个数和类型,序列号,CPU数量,命令行查询网卡速率
  15. vue3+vite+antd——后台管理系统——基础模板
  16. 如何在Windows上测试ip和端口
  17. 图片怎么缩小到300k?如何将图片缩小到300k以内?
  18. Java数组去重问题
  19. js字符串日期直接比较大小
  20. 北京小汽车出行比例首次下降

热门文章

  1. python 数据分析 实际案例-Python数据分析案例实战
  2. vivado ILA在线逻辑仪使用
  3. autocad plant 3d 2022 安装教程
  4. 【Rails】TDD-测试驱动开发
  5. 计算机网络ip地址计算,知道IP地址怎么算网络地址? 网络地址的推算方法
  6. 磁力链接做成rar文件后怎么打开
  7. 2016 php cms award,官方年度大奖公布 本站“与劳拉同行”摄影大赛获得2016年度最佳艺术活动组织奖...
  8. RFID智能档案柜/智能文件流转柜
  9. 老兵不死——麦克 阿瑟
  10. 值得购买的国产蓝牙耳机有哪些?性价比高的国产蓝牙耳机盘点