OpenCV中的同态过滤



我正试图使用高斯LPF编写同态滤波的代码,但结果我在最后得到了一个全黑图像。代码中编写的过滤器部分在其他应用程序中非常适用!

#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2highguihighgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
    // Variables ========================================================================================
    int D0_GHPF = 80; // Gaussian HPF cut-off deviation
    // ==================================================================================================
    // Getting the frequency and magnitude of image =====================================================
    cv::Mat image = cv::imread("test2.tif", CV_LOAD_IMAGE_GRAYSCALE);
    if( image.empty())
        return -1;
    image.convertTo(image, CV_32F);
    image += 1;
    log(image,image);
    cv::Mat padded1;                          
    int m1 = cv::getOptimalDFTSize( image.rows );
    int n1 = cv::getOptimalDFTSize( image.cols );
    cv::copyMakeBorder(image, padded1, 0, m1 - image.rows, 0, n1 - image.cols, cv::BORDER_CONSTANT, cv::Scalar::all(0));
    cv::Mat image_planes[] = {cv::Mat_<float>(padded1), cv::Mat::zeros(padded1.size(), CV_32F)};
    cv::Mat image_complex;
    cv::merge(image_planes, 2, image_complex);         
    cv::dft(image_complex, image_complex);
    cv::split(image_complex, image_planes);
    // starting with this part we have the real part of the image in planes[0] and the imaginary in planes[1]
    cv::Mat image_phase;
    cv::phase(image_planes[0], image_planes[1], image_phase);
    cv::Mat image_mag;
    cv::magnitude(image_planes[0], image_planes[1], image_mag);
    // Shifting the DFT
    image_mag = image_mag(cv::Rect(0, 0, image_mag.cols & -2, image_mag.rows & -2));
    int cx = image_mag.cols/2;
    int cy = image_mag.rows/2;

    cv::Mat q0(image_mag, cv::Rect(0, 0, cx, cy));
    cv::Mat q1(image_mag, cv::Rect(cx, 0, cx, cy));
    cv::Mat q2(image_mag, cv::Rect(0, cy, cx, cy));
    cv::Mat q3(image_mag, cv::Rect(cx, cy, cx, cy));
    cv::Mat tmp;
    q0.copyTo(tmp);
    q3.copyTo(q0);
    tmp.copyTo(q3);
    q1.copyTo(tmp);
    q2.copyTo(q1);
    tmp.copyTo(q2);
    // Creating GHPF ====================================================================================
    cv::Mat GHPF(image_mag.size(), CV_32F, 255);
    float tempVal = float((-1.0)/float(pow(float(D0_GHPF),2)));
    for (int i=0; i < GHPF.rows; i++)
        for (int j=0; j < GHPF.cols; j++)
        {
            float dummy2 = float(pow(float(i - cy), 2) + pow(float(j - cx), 2));
            dummy2 = (2.0 - 0.25) * (1.0 - float(exp(float(dummy2 * tempVal)))) + 0.25;
            GHPF.at<float>(i,j) = 255 * dummy2;
        }
    cv::normalize(GHPF, GHPF, 0, 1, CV_MINMAX);
    cv::imshow("test", GHPF);
    cv::waitKey(0);
    // Applying GHPF filter ==================================================================================
    cv::Mat GHPF_result(image_mag.size(), CV_32F);
    cv::multiply(image_mag, GHPF, GHPF_result);
    // reversing the shift ==============================================================================
    cv::Mat q0_GHPF(GHPF_result, cv::Rect(0, 0, cx, cy));
    cv::Mat q1_GHPF(GHPF_result, cv::Rect(cx, 0, cx, cy));
    cv::Mat q2_GHPF(GHPF_result, cv::Rect(0, cy, cx, cy));
    cv::Mat q3_GHPF(GHPF_result, cv::Rect(cx, cy, cx, cy));
    cv::Mat tmp_GHPF;
    q0_GHPF.copyTo(tmp_GHPF);
    q3_GHPF.copyTo(q0_GHPF);
    tmp_GHPF.copyTo(q3_GHPF);
    q1_GHPF.copyTo(tmp_GHPF);
    q2_GHPF.copyTo(q1_GHPF);
    tmp_GHPF.copyTo(q2_GHPF);
    // Reconstructing the image with new GHPF filter ====================================================
    cv::Mat GHPFresult_planes[2];
    cv::polarToCart(GHPF_result, image_phase,GHPFresult_planes[0], GHPFresult_planes[1]);
    cv::Mat GHPFresult_complex;
    cv::merge(GHPFresult_planes,2,GHPFresult_complex);
    //calculating the iDFT for GHPF
    cv::Mat GHPF_inverseTransform;
    cv::dft(GHPFresult_complex, GHPF_inverseTransform, cv::DFT_INVERSE|cv::DFT_REAL_OUTPUT);
    exp(GHPF_inverseTransform,GHPF_inverseTransform);
    cv::normalize(GHPF_inverseTransform, GHPF_inverseTransform, 0, 1, CV_MINMAX);
    cv::imshow("GHPF Reconstructed", GHPF_inverseTransform);
    cv::waitKey(0);
}

该理论基于Gonzalez第三版的章节,数字图像处理

嗯,我在同态滤波方面也遇到了困难。当涉及到exp:#INF 时,我发现你的代码有问题

cv::normalize(GHPF_inverseTransform, GHPF_inverseTransform, 0, 1, CV_MINMAX);
cv::exp(GHPF_inverseTransform, GHPF_inverseTransform); 
cv::normalize(GHPF_inverseTransform, GHPF_inverseTransform, 0,255, CV_MINMAX);

像这样,会发生一些不同的事情。然后

cv::normalize(GHPF_inverseTransform, GHPF_inverseTransform, 0, 0.000001, CV_MINMAX);
cv::exp(GHPF_inverseTransform, GHPF_inverseTransform); 
cv::normalize(GHPF_inverseTransform, GHPF_inverseTransform, 100,255, CV_MINMAX);

这一次我可以清楚地看到图像(好吧,但它看起来像minecraft的图像)所以我复制了另一个GHPF,效果很好。

所以我想你的GHPF还是有问题的。(对不起我英语不好:p)

最新更新