在频域中更改亮度

时间:2019-02-23 18:45:12

标签: python numpy image-processing fft frequency

我可能不了解频域的工作原理。对于一个项目,我必须在不使用空间域的情况下使用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

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

1 个答案:

答案 0 :(得分:3)

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

由于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。用脉冲函数卷积与乘以常数相同。

转到频域以更改亮度是很浪费的,但是如果您已经在那儿,可以这样做。