频域中的卷积偏移和因子

信息处理 图像处理 卷积 频域
2022-02-10 03:44:34

请参阅此链接以下空间域中的卷积代码是用 C# 编写的。

private void SafeImageConvolution(Bitmap image, ConvMatrix fmat) 
{ 
    //Avoid division by 0 
    if (fmat.Factor == 0) 
        return; 

    Bitmap srcImage = (Bitmap)image.Clone(); 

    int x, y, filterx, filtery; 
    int s = fmat.Size / 2; 
    int r, g, b; 
    Color tempPix; 

    for (y = s; y < srcImage.Height - s; y++) 
    { 
        for (x = s; x < srcImage.Width - s; x++) 
        { 
            r = g = b = 0; 

            // Convolution 
            for (filtery = 0; filtery < fmat.Size; filtery++) 
            { 
                for (filterx = 0; filterx < fmat.Size; filterx++) 
                { 
                    tempPix = srcImage.GetPixel(x + filterx - s, y + filtery - s); 

                    r += fmat.Matrix[filtery, filterx] * tempPix.R; 
                    g += fmat.Matrix[filtery, filterx] * tempPix.G; 
                    b += fmat.Matrix[filtery, filterx] * tempPix.B; 
                } 
            } 

            r = Math.Min(Math.Max((r / fmat.Factor) + fmat.Offset, 0), 255); 
            g = Math.Min(Math.Max((g / fmat.Factor) + fmat.Offset, 0), 255); 
            b = Math.Min(Math.Max((b / fmat.Factor) + fmat.Offset, 0), 255); 

            image.SetPixel(x, y, Color.FromArgb(r, g, b)); 
        }
    } 
}

请注意以下几行:

    r = Math.Min(Math.Max((r / fmat.Factor) + fmat.Offset, 0), 255); 
    g = Math.Min(Math.Max((g / fmat.Factor) + fmat.Offset, 0), 255); 
    b = Math.Min(Math.Max((b / fmat.Factor) + fmat.Offset, 0), 255); 

这些行将 Red、Green 和 Blue 的值保持在0255之间。我们能够改变FactorOffset控制输出图像的对比度/亮度。

我们如何在频域中达到相同的效果?即我们如何改变频域中的factor和的值?offset

我们知道空间域中的卷积运算等于频域中的乘法运算在频域中,我们将两个复数相乘。这些复数的哪一部分代表factoroffset

1个回答

将 R、G、B 通道的范围保持在有效 [0,255] 范围内的那些线适用于单个像素。像素值和 0 / 255 级别之间有一个比较。不幸的是,此操作需要知道确切的像素值。然而,傅里叶变换将所有单独的像素值混合到所有频率区间中,除非明确(且低效地)反转给定像素,否则该值是不可访问的。

所以不可能限制频域中的单个像素值。