我想应用我在标题中命名的降噪滤波器,它基于以下公式:

opencv - 模拟各向同性线性扩散平滑-LMLPHP

其中d = 1是标量常数扩散系数,I(x, y)是初始噪声图像,u(x, y, t)是在扩散时间后获得的图像t可以说5, 10 and 30。但是,我对于在OpenCV中使用哪个函数以及如何使用它感到困惑。我觉得它很简单,但是由于某种原因我感到困惑。有人有主意吗?

这是一个示例图像:

opencv - 模拟各向同性线性扩散平滑-LMLPHP

然后,我想将其与根据以下内容的高斯滤波方法进行比较:

opencv - 模拟各向同性线性扩散平滑-LMLPHP

其中G√2t (x, y)是高斯内核。这证明使用t对时间d = 1执行各向同性线性扩散与使用σ = √(2t)执行高斯平滑完全等效

我有一个应用高斯滤波的函数:

void gaussian_2D_convolution(const cv::Mat& src, cv::Mat& dst, const float sigma, const int ksize_x = 0, const int ksize_y = 0)
{
    int ksize_x_ = ksize_x, ksize_y_ = ksize_y;

    // Compute an appropriate kernel size according to the specified sigma
    if (sigma > ksize_x || sigma > ksize_y || ksize_x == 0 || ksize_y == 0)
    {
        ksize_x_ = (int)ceil(2.0f*(1.0f + (sigma - 0.8f) / (0.3f)));
        ksize_y_ = ksize_x_;
    }

    // The kernel size must be and odd number
    if ((ksize_x_ % 2) == 0)
    {
        ksize_x_ += 1;
    }

    if ((ksize_y_ % 2) == 0)
    {
        ksize_y_ += 1;
    }

    // Perform the Gaussian Smoothing
    GaussianBlur(src, dst, Size(ksize_x_, ksize_y_), sigma, sigma, BORDER_DEFAULT);

    // show result
    std::ostringstream out;
    out << std::setprecision(1) << std::fixed << sigma;
    String title = "sigma: " + out.str();
    imshow(title, dst);
    imwrite("gaussian/" + title + ".png", dst);

    waitKey(260);
}

但我很难执行第一种情况。

最佳答案

这应该按预期工作。这是基于:

  • Octave Perona & Malik smooth
  • 您对answer.opencv
  • 问题的评论

    码:
    #include <opencv2\opencv.hpp>
    using namespace cv;
    
    void ilds(const Mat1b& src, Mat1b& dst, int iter = 10, double diffusivity = 1.0, double lambda = 0.1)
    {
        Mat1f img;
        src.convertTo(img, CV_32F);
        lambda = fmax(0.001, std::fmin(lambda, 0.25)); // something in [0, 0.25] by default should be 0.25
        while (iter--)
        {
            Mat1f lap;
            Laplacian(img, lap, CV_32F);
            img += lambda * diffusivity * lap;
        }
    
        img.convertTo(dst, CV_8U);
    }
    
    int main() {
    
        Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE);
        Mat1b res_ilds;
        ilds(img, res_ilds);
    
        imshow("ILDS", res_ilds);
        waitKey();
    
        return 0;
    }
    

    结果:

    opencv - 模拟各向同性线性扩散平滑-LMLPHP

    请让我知道这对你有没有用

    关于opencv - 模拟各向同性线性扩散平滑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32531968/

    10-10 22:58