一、实验内容及原理
1、 灰度图像的 DFT 和 IDFT
具体内容:利用 OpenCV 提供的 cvDFT 函数对图像进行 DFT 和 IDFT 变换 。
2、 利用理想高通和低通滤波器对灰度图像进行频域滤波
具体内容:利用 cvDFT 函数实现 DFT,在频域上利用理想高通和低通滤波 器进行滤波,并把滤波过后的图像显示在屏幕上(观察振铃现象),要求截止频 率可输入。
3、 利用布特沃斯高通和低通滤波器对灰度图像进行频域滤波
具体内容:利用 cvDFT 函数实现 DFT,在频域上进行利用布特沃斯高通和 低通滤波器进行滤波,并把滤波过后的图像显示在屏幕上(观察振铃现象),要 求截止频率和 n 可输入。
二、实验代码
实验环境:
(1)OpenCV3.4.3
(2)Ubuntu16.04
(3)VS Code
(4)C++
#include <stdio.h>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <string>
class Experiment5 {
public:
Experiment5(std::vector<std::string> path){
filter_name.push_back("理想低通滤波器");
filter_name.push_back("理想高通滤波器");
filter_name.push_back("布特沃斯低通滤波器");
filter_name.push_back("布特沃斯高通滤波器");
for(int i = 0; i < path.size(); i++){
original_color_image.push_back(cv::imread(path[i]));
original_gray_image.push_back(color2Gray(original_color_image[i]));
zeroPadding(i);
gray_fourier.push_back(imageDFT(gray_image_padding[i]));
}
int row = gray_image_padding[0].rows, col = gray_image_padding[0].cols;
makeIdealLowPassFilterKernel(row, col);
makeIdealHighPassFilterKernel(row, col);
makeButterworseLowPassFilterKernel(row, col);
makeButterworseHighPassFilterKernel(row, col);
moveFourier();
std::cout<< "初始化结束" << "\n";
}
// 0 彩色图像转灰度图像
cv::Mat color2Gray(cv::Mat& src){
//创建与原图同类型和同大小的矩阵
cv::Mat gray_image = cv::Mat::zeros(src.rows, src.cols, CV_8UC1);
if(src.channels()!=1){
for(int i = 0; i < src.rows; i++)
for(int j = 0; j < src.cols; j++)
gray_image.at<uchar>(i, j) = (src.at<cv::Vec3b>(i, j)[0] + src.at<cv::Vec3b>(i, j)[1] + src.at<cv::Vec3b>(i, j)[2]) / 3;
}
else
gray_image = src.clone();
return gray_image;
}
// 0.1 零填充
void zeroPadding(int pic_id){
int centeri = original_gray_i