【问题标题】:Change brightness in frequency domain在频域改变亮度
【发布时间】:2019-07-17 14:23:03
【问题描述】:

我可能不明白频域是如何工作的。对于一个项目,我必须使用 Python 更改图像的亮度,而无需在空间域中工作。

目前我可以通过卷积应用一些模糊滤镜,如下例所示:

 def arithmeticMeanFilter(self, img):

    img = img.convert('RGB')
    open_cv_image = np.array(img)
    red = open_cv_image[:, :, 0]
    green = open_cv_image[:, :, 1]
    blue = open_cv_image[:, :, 2]

    mean_arithmetic = np.ones((9, 9))*(1/81)

    width, height, _ = open_cv_image.shape

    kernel1 = np.zeros((width, height))
    kernel1[:mean_arithmetic.shape[0], :mean_arithmetic.shape[1]] = mean_arithmetic
    kernel1 = np.fft.fft2(kernel1)


    im = np.array(red)
    fim = np.fft.fft2(im)
    Rx = np.real(np.fft.ifft2(kernel1 * fim)).astype(float)

    im = np.array(green)
    fim = np.fft.fft2(im)
    Gx = np.real(np.fft.ifft2(kernel1 * fim)).astype(float)

    im = np.array(blue)
    fim = np.fft.fft2(im)
    Bx = np.real(np.fft.ifft2(kernel1 * fim)).astype(float)

    open_cv_image[:, :, 0] = abs(Rx)
    open_cv_image[:, :, 1] = abs(Gx)
    open_cv_image[:, :, 2] = abs(Bx)

    img = Image.fromarray(open_cv_image)

    return img

但是如何使用这种技术来改变亮度呢?

【问题讨论】:

    标签: python numpy image-processing fft frequency


    【解决方案1】:

    改变图像的亮度是通过将每个像素乘以一个常数来实现的。

    因为Fourier transform is a linear operation,在空间域乘以一个常数,就相当于在频域乘以相同的常数。

    函数F的线性度定义为:

    aF(x) + bF(y) = F(ax + by)

    从这个方程很容易证明 aF(x) = F(ax),或者,正如我上面所说,在一个域中相乘等于在另一个域中相乘。

    kmario23 commented 频域中的乘法是空间域中的卷积。这是真实的。但是由于我们处理的是一个常数,所以事情就简单了一些。无论如何,可以看出频域中的常数函数是空间域中的impulse (or dirac delta) function。与脉冲函数进行卷积与乘以常数相同。

    去频域改变亮度是浪费的,但如果你已经在那里,你可以这样做。

    【讨论】:

    • 不应该是“傅里叶域的乘法相当于空间域的卷积”吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多