ArrayFire:为什么卷积后反卷积不返回原始图像(甚至不接近)

ArrayFire: Why doesn't convolution followed by deconvolution return the original image (not even close)

提问人:speca 提问时间:10/19/2023 更新时间:10/19/2023 访问量:59

问:

我正在尝试使用 C++ 中的 ArrayFire 为图像去模糊应用程序执行卷积和反卷积。出于测试目的,我有一个 5x5 映像和一个 3x3 内核。我使用 af::convolve2 对图像进行卷积,然后使用 af::iterativeDeconv 对其进行反卷积。但是,去卷积的值与原始图像不匹配。

有趣的是,与 Richardson-Lucy 算法相比,使用 Landweber 反卷积算法时,不匹配更大。

这是我的代码:

    // Create a simple 5x5 input image
    float h_image[25] = {
        1, 1, 1, 1, 1,
        1, 2, 2, 2, 1,
        1, 2, 3, 2, 1,
        1, 2, 2, 2, 1,
        1, 1, 1, 1, 1,
    };
    af::array image(5, 5, h_image);

    // Create a simple 3x3 kernel (normalized such that sum == 1)for convolution
    float h_kernel[9] = {
        0.111, 0.111, 0.111,
        0.111, 0.111, 0.111,
        0.111, 0.111, 0.111,
    };
    af::array kernel(3, 3, h_kernel);

    // Perform convolution
    af::array convolved = af::convolve2(image, kernel);

    // Perform deconvolution
    float relaxation_factor = 0.64;
    int num_iterations = 128;
    af::array deconvolved_richardson_lucy = af::iterativeDeconv(convolved, kernel, num_iterations, relaxation_factor, AF_ITERATIVE_DECONV_RICHARDSONLUCY);
    af::array deconvolved_landweber = af::iterativeDeconv(convolved, kernel, num_iterations, relaxation_factor, AF_ITERATIVE_DECONV_LANDWEBER);

    // Output results
    af::print("Original Image", image);
    af::print("Convolved Image", convolved);
    af::print("Deconvolved Image - Richardson Lucy", deconvolved_richardson_lucy);
    af::print("Deconvolved Image - Landweber", deconvolved_landweber);

输出为:

Original Image
[5 5 1 1]
    1.0000     1.0000     1.0000     1.0000     1.0000 
    1.0000     2.0000     2.0000     2.0000     1.0000 
    1.0000     2.0000     3.0000     2.0000     1.0000 
    1.0000     2.0000     2.0000     2.0000     1.0000 
    1.0000     1.0000     1.0000     1.0000     1.0000 

Convolved Image
[5 5 1 1]
    0.5550     0.8880     0.9990     0.8880     0.5550 
    0.8880     1.5540     1.7760     1.5540     0.8880 
    0.9990     1.7760     2.1090     1.7760     0.9990 
    0.8880     1.5540     1.7760     1.5540     0.8880 
    0.5550     0.8880     0.9990     0.8880     0.5550 

Deconvolved Image - Richardson Lucy
[5 5 1 1]
    0.3774     0.5695     1.0053     0.5695     0.3774 
    0.5695     1.2211     2.2630     1.2211     0.5695 
    1.0053     2.2630     4.7015     2.2630     1.0053 
    0.5695     1.2211     2.2630     1.2211     0.5695 
    0.3774     0.5695     1.0053     0.5695     0.3774 

Deconvolved Image - Landweber
[5 5 1 1]
   23.2821    32.3862    71.3124    32.3862    23.2820 
   32.3862    80.7867   151.3048    80.7867    32.3862 
   71.3124   151.3049   276.6479   151.3048    71.3124 
   32.3862    80.7867   151.3048    80.7867    32.3862 
   23.2821    32.3862    71.3124    32.3862    23.2820 

为什么反卷积图像中的值与原始图像不匹配? 为什么理查森-露西和兰德韦伯之间会有如此巨大的差异? 显然,我一定错过了什么。任何正确方向的指导将不胜感激。

我已经为反卷积算法试验了各种内核和不同次数的迭代。我的期望是,随着迭代次数的增加(最多达到一定次数的迭代),去卷积的图像会更接近原始图像,但事实并非如此。

C++ 图像处理 积反卷 ArrayFire

评论

3赞 Oersted 10/19/2023
因为卷积一般是不可逆运算。它破坏了信息。
0赞 Cris Luengo 10/19/2023
您也无法修复这两种算法的参数,您必须为每个算法独立优化参数。
0赞 Mark Ransom 10/19/2023
您知道卷积和反卷积如何处理数据集边缘吗?您的示例图像太小,无法进行良好的测试。

答: 暂无答案