逆滤波c++不用库 代码
时间: 2023-08-06 07:19:38 浏览: 41
以下是一个简单的逆滤波 C++ 代码示例,不依赖于任何库:
```c++
#include <iostream>
// 定义图像宽度和高度
const int WIDTH = 512;
const int HEIGHT = 512;
// 计算二维傅里叶变换
void dft2D(double** input, double** output, int width, int height, int dir)
{
double re, im;
double pi2 = dir * 2.0 * 3.14159265358979323846;
for(int i = 0; i < height; i++) {
for(int j = 0; j < width; j++) {
re = im = 0.0;
for(int k = 0; k < height; k++) {
for(int l = 0; l < width; l++) {
double tmp = pi2 * (double)(j * k + i * l) / (double)(width * height);
re += input[k][l] * cos(tmp);
im -= input[k][l] * sin(tmp);
}
}
output[i][j] = (dir == 1) ? (re / (double)(width * height)) : (re);
}
}
}
// 计算高斯滤波器
void gaussianFilter(double** filter, int width, int height, double sigma)
{
double sum = 0.0;
for(int i = 0; i < height; i++) {
for(int j = 0; j < width; j++) {
filter[i][j] = exp(-(double)(i * i + j * j) / (2.0 * sigma * sigma));
sum += filter[i][j];
}
}
for(int i = 0; i < height; i++) {
for(int j = 0; j < width; j++) {
filter[i][j] /= sum;
}
}
}
// 对图像进行逆滤波
void inverseFilter(double** input, double** output, int width, int height, double** filter, int filter_width, int filter_height)
{
double** input_freq = new double*[height];
double** filter_freq = new double*[height];
double** output_freq = new double*[height];
for(int i = 0; i < height; i++) {
input_freq[i] = new double[width];
filter_freq[i] = new double[width];
output_freq[i] = new double[width];
}
// 对输入图像和滤波器进行傅里叶变换
dft2D(input, input_freq, width, height, 1);
dft2D(filter, filter_freq, filter_width, filter_height, 1);
// 逆滤波
for(int i = 0; i < height; i++) {
for(int j = 0; j < width; j++) {
double re = input_freq[i][j] * filter_freq[i][j];
double im = 0.0;
output_freq[i][j] = re / (re * re + im * im + 0.1);
}
}
// 对输出图像进行傅里叶变换
dft2D(output_freq, output, width, height, -1);
for(int i = 0; i < height; i++) {
delete[] input_freq[i];
delete[] filter_freq[i];
delete[] output_freq[i];
}
delete[] input_freq;
delete[] filter_freq;
delete[] output_freq;
}
int main()
{
// 生成一个测试图像
double** input_image = new double*[HEIGHT];
for(int i = 0; i < HEIGHT; i++) {
input_image[i] = new double[WIDTH];
for(int j = 0; j < WIDTH; j++) {
input_image[i][j] = (i + j) % 256;
}
}
// 生成一个高斯滤波器
int filter_width = 5;
int filter_height = 5;
double sigma = 1.0;
double** filter = new double*[filter_height];
for(int i = 0; i < filter_height; i++) {
filter[i] = new double[filter_width];
}
gaussianFilter(filter, filter_width, filter_height, sigma);
// 对图像进行逆滤波
double** output_image = new double*[HEIGHT];
for(int i = 0; i < HEIGHT; i++) {
output_image[i] = new double[WIDTH];
}
inverseFilter(input_image, output_image, WIDTH, HEIGHT, filter, filter_width, filter_height);
// 输出结果
for(int i = 0; i < HEIGHT; i++) {
for(int j = 0; j < WIDTH; j++) {
std::cout << output_image[i][j] << " ";
}
std::cout << std::endl;
}
// 释放内存
for(int i = 0; i < HEIGHT; i++) {
delete[] input_image[i];
delete[] output_image[i];
}
delete[] input_image;
delete[] output_image;
for(int i = 0; i < filter_height; i++) {
delete[] filter[i];
}
delete[] filter;
return 0;
}
```
该代码生成一个测试图像,然后生成一个高斯滤波器,并对测试图像进行逆滤波,最后输出结果。请注意,此代码中的傅里叶变换实现非常简单,并且可能不适用于大型图像。