OpenCV 低通滤波(输入数据)

#include <opencv2corecore.hpp>
#include <opencv2highguihighgui.hpp>
#include <opencv2imgprocimgproc.hpp>
#include <iostream>
#include<fstream>
using namespace std;
using namespace cv;
int main()
{
    vector<float> src;
    string path = "E:\实习入门\原跳动\1.txt";
    ifstream infile;
    infile.open(path, ios::in);
    if (!infile)
    {
        cout << "读取文件失败" << endl;
    }
    float i = 0;

    while (!infile.eof())
    {

        infile >> i;
        
        src.push_back(i);
        if (infile.fail())
            break;
    }
    infile.close();
    int c = src.size();
    vector<float>padde(src);
    int r = getOptimalDFTSize(src.size());
    int w = r - c;
    for (int i = 0; i < w; i++)
    {
        padde.push_back(0);
    }
    //src信号的实部、虚部
    Mat_<float> src_real = Mat_<float>(padde);
    Mat_<float> src_img = Mat::zeros(r, 1, CV_32F);
    vector<Mat_<float>> data;
    data.push_back(src_img);
    data.push_back(src_real);
    Mat complexImg;
    merge(data, complexImg); //可以理解为组合成2通道(实部+虚部)图像
    dft(complexImg, complexImg); //DFT变换后的数据复制到原处,没有另外开辟内存, complexImg是个复数矩阵
    int cy = complexImg.rows / 2;
    Mat m1(complexImg, cv::Rect(0, 0, 1, cy)); //左上部分
    Mat m2(complexImg, cv::Rect(0,cy, 1, cy)); //右上部分
    Mat temp;
    m1.copyTo(temp);
    m2.copyTo(m1);
    temp.copyTo(m2);

    split(complexImg, data);
    Mat src_dft_nor;
    magnitude(data[0], data[1], src_dft_nor);
    normalize(src_dft_nor, src_dft_nor, 1, 0, CV_MINMAX);
    //除去高频;
    //int data_temp_loat;
    //Mat src_nor_t=src_dft_nor.t();//转置
    //for (int i = 0; i < src_nor_t.cols; i++)
    //{
    //    float *data_ = src_nor_t.ptr<float>(0);
    //    if (data_[i]==1 )
    //    {
    //        data_temp_loat =i;
    //    }
    //}
    //Mat src_low=src_nor_t.t();
    /*Mat temp;
    m1.copyTo(temp);
    m2.copyTo(m1);
    temp.copyTo(m2);*/
     int y= complexImg.rows ;

    Mat partFrequencyImg_t = (complexImg.clone()).t();

    
    int colNumber = partFrequencyImg_t.cols*partFrequencyImg_t.channels();  //列数 x 通道数=每一行元素的个数
    int data_locate= partFrequencyImg_t.cols;
    //双重循环,遍历所有的像素值
    float * partFrequencyImg_t_data = partFrequencyImg_t.ptr<float>(0);  //获取第i行的首地址
    for (int i = 0; i < colNumber; i++)
    {
        if (i == (data_locate-3) || i == data_locate +3)
            ;
        else
        {
            partFrequencyImg_t_data[i] = 0;
        }
    }
    Mat partFrequencyImg= partFrequencyImg_t.t();
    //partFrequencyImg.colRange(0, 1).setTo(Scalar::all(0));
    /*partFrequencyImg.rowRange(0, y/2).setTo(Scalar::all(0));
    partFrequencyImg.rowRange(y/2+1,y).setTo(Scalar::all(0));*/
    Mat iPartDft[] = { Mat::zeros(complexImg.size(),CV_32F),Mat::zeros(complexImg.size(),CV_32F) };
    idft(partFrequencyImg, partFrequencyImg);

    split(partFrequencyImg, iPartDft);
    Mat data_temp;
    magnitude(iPartDft[0], iPartDft[1], data_temp);
    Mat data_img;
    cv::normalize(data_temp, data_img, 1, 0, CV_MINMAX);
    ofstream outfile;
    string path_out = "E:\C++\other_test\file_out.csv";
    outfile.open(path_out, ios::out);
    for (int i = 0; i < data_temp.rows; i++)
    {
        outfile<<data_temp.at<float>(i)<<endl;
    }
    outfile.close();

    
    
    
}
    
原文地址:https://www.cnblogs.com/hsy1941/p/11381527.html