OpenCV : homomorphic filter

后端 未结 2 1365
没有蜡笔的小新
没有蜡笔的小新 2021-01-13 15:59

i want to use a homomorphic filter to work on underwater image. I tried to code it with the codes found on the internet but i have always a black image... I tried to normali

相关标签:
2条回答
  • 2021-01-13 16:34

    I was doing this method to balance illumination when camera was changed caused the Image waw dark!

    I tried to FFT to the frequency to filter the image! it's work.but use too much time.(2750*3680RGB image).so I do it in Spatial domain.

    here is my code!

    //IplImage *imgSrcI=cvLoadImage("E:\\lean.jpg",-1);
    Mat imgSrcM(imgSrc,true);
    Mat imgDstM;
    
    Mat imgGray;
    Mat imgHls;
    vector<Mat> vHls;
    
    Mat imgTemp1=Mat::zeros(imgSrcM.size(),CV_64FC1);
    Mat imgTemp2=Mat::zeros(imgSrcM.size(),CV_64FC1);
    
    if(imgSrcM.channels()==1)
    {
        imgGray=imgSrcM.clone();
    }
    else if (imgSrcM.channels()==3)
    {
        cvtColor(imgSrcM, imgHls, CV_BGR2HLS);
        split(imgHls, vHls);
        imgGray=vHls.at(1);
    }
    else
    {
        return -1;
    }
    imgGray.convertTo(imgTemp1,CV_64FC1);
    imgTemp1=imgTemp1+0.0001;
    log(imgTemp1,imgTemp1);
    
    GaussianBlur(imgTemp1, imgTemp2, Size(21, 21), 0.1, 0.1, BORDER_DEFAULT);//imgTemp2是低通滤波的结果
    imgTemp1 = (imgTemp1 - imgTemp2);//imgTemp1是对数减低通的高通
    addWeighted(imgTemp2, 0.7, imgTemp1, 1.4, 1, imgTemp1, -1);//imgTemp1是压制低频增强高频的结构
    
    exp(imgTemp1,imgTemp1);
    normalize(imgTemp1,imgTemp1,0,1,NORM_MINMAX);
    imgTemp1=imgTemp1*255;
    
    imgTemp1.convertTo(imgGray, CV_8UC1);
    
    //imwrite("E:\\leanImgGray.jpg",imgGray);
    if (imgSrcM.channels()==3)
    {
        vHls.at(1)=imgGray;
        merge(vHls,imgHls);
        cvtColor(imgHls, imgDstM, CV_HLS2BGR);
    
    }
    else if (imgSrcM.channels()==1)
    {
        imgDstM=imgGray.clone();
    }
    
    cvCopy(&(IplImage)imgDstM,imgDst);
    //cvShowImage("jpg",imgDst);
    
    return 0;
    
    0 讨论(0)
  • 2021-01-13 16:40

    I took your code corrected it at a few places and got decent results as the homographic filter output.

    Here are the corrections that I made.

    1) Instead of working just on the image_mag, work on the full output of the FFT.

    2) your filter values of high_h_v_TB = 101 and low_h_v_TB = 99 virtually made little effect in filtering.

    Here are the values I used.

    int high_h_v_TB = 100;
    int low_h_v_TB = 20;
    int D = 10;// radius of band pass filter parameter
    int order = 4;
    

    Here is my main code

    //float_img == grayscale image in 0-1 scale
    Mat log_img;
    log(float_img, log_img);
    
    
    Mat fft_phase, fft_mag;
    Mat fft_complex;
    HomomorphicFilter::Fourier_Transform(log_img, fft_complex);
    HomomorphicFilter::ShiftFFT(fft_complex);
    
    int high_h_v_TB = 100;
    int low_h_v_TB = 30;
    int D = 10;// radius of band pass filter parameter
    int order = 4;
    
    //get a butterworth filter of same image size as the input image
    //dont call mulSpectrums yet, just get the filter of correct size
    Mat butterWorthFreqDomain;
    HomomorphicFilter::ButterworthFilter(fft_complex.size(), butterWorthFreqDomain,  D, order, high_h_v_TB, low_h_v_TB);
    
    
    //this should match fft_complex in size and type
    //and is what we will be using for 'mulSpectrums' call
    Mat butterworth_complex;
    //make two channels to match fft_complex
    Mat butterworth_channels[] = {Mat_<float>(butterWorthFreqDomain.size()), Mat::zeros(butterWorthFreqDomain.size(), CV_32F)};
    merge(butterworth_channels, 2, butterworth_complex);
    
    
    //do mulSpectrums on the full fft
    mulSpectrums(fft_complex, butterworth_complex, fft_complex, 0);
    
    //shift back the output
    HomomorphicFilter::ShiftFFT(fft_complex);
    Mat log_img_out;
    
    HomomorphicFilter::Inv_Fourier_Transform(fft_complex,  log_img_out);
    
    Mat float_img_out;
    exp(log_img_out, float_img_out);
    //float_img_out is gray in 0-1 range
    

    Here is my output. Here is my output

    0 讨论(0)
提交回复
热议问题