Почему передача изображения через фильтр нижних частот дает значения выше, чем исходное изображение? - PullRequest
1 голос
/ 20 марта 2020

У меня есть гибридное изображение, которое было создано путем наложения низких частот одного изображения на высокие частоты другого. Я пытаюсь отделить (де-гибридизировать) это изображение, пропустив его через фильтр нижних частот, чтобы извлечь низкие частоты (одно из двух изображений), а затем вычесть это из исходного изображения, чтобы получить другое изображение (высокое частот).

** Проблема: ** Когда я извлекаю низкие частоты, все значения выше исходного изображения, поэтому, когда я вычитаю низкие частоты из исходного изображения, остается куча отрицательные значения.

Кто-нибудь знает, почему мой фильтр нижних частот дает более высокие значения частоты, чем исходное изображение?

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from numpy.fft import fft2, ifft2, fftshift, ifftshift

# Make Gaussian filter
def makeGaussianFilter(numRows, numCols, sigma, highPass=True):
   centerI = int(numRows/2) + 1 if numRows % 2 == 1 else int(numRows/2)
   centerJ = int(numCols/2) + 1 if numCols % 2 == 1 else int(numCols/2)

   def gaussian(i,j):
      coefficient = np.exp(-1.0 * ((i - centerI)**2 + (j - centerJ)**2) / (2 * sigma**2))
      return 1 - coefficient if highPass else coefficient

   return np.array([[gaussian(i,j) for j in range(numCols)] for i in range(numRows)])

# Filter discrete Fourier transform
def filterDFT(imageMatrix, filterMatrix):
   shiftedDFT = fftshift(fft2(imageMatrix))
   filteredDFT = shiftedDFT * filterMatrix
   return ifft2(ifftshift(filteredDFT))

# Low-pass filter
def lowPass(imageMatrix, sigma):
   n,m = imageMatrix.shape
   return filterDFT(imageMatrix, makeGaussianFilter(n, m, sigma, highPass=False))

# Read in einsteinandwho.png and convert to format that can be displayed by plt.imshow
im3 = mpimg.imread('einsteinandwho.png')
rows = im3.shape[0]
cols = im3.shape[1]
img3 = np.ones((rows, cols, 4))
for i in range(rows):
    for j in range(cols):
        img3[i][j][0:3] = im3[i][j]
        img3[j][j][3] = 1

# Extract low frequencies and convert to format that can be displayed by plt.imshow
lowPassed = np.real(lowPass(im3, 10))
low = np.ones((rows, cols, 4))

for i in range(rows):
    for j in range(cols):
        low[i][j][0:3] = lowPassed[i][j]
        low[j][j][3] = 1

# Remove low frequencies from image
output = img3[:,:,0:3] - low[:,:,0:3]

1 Ответ

0 голосов
/ 20 марта 2020

Кто-нибудь знает, почему мой фильтр нижних частот дает более высокие значения частоты, чем исходное изображение?

Обратите внимание на разницу между значениями пикселей и значениями частоты. Вы видите, что значения пикселей выше, а не значения частоты!


Когда я запускаю ваш код, я вижу высокочастотный компонент, имеющий как отрицательные, так и положительные значения пикселей, а не все отрицательные значения. Ожидается, что это изображение будет иметь нулевое среднее значение. Компонент нулевой частоты (также называемый компонентом D C) - это тот, который устанавливает среднее значение пикселя. Вычитая низкочастотное фильтрованное изображение, вы устанавливаете нулевую частоту на 0 и, таким образом, устанавливаете среднее значение пикселя на 0 (низкочастотное фильтрованное изображение содержит всю мощность нулевой частоты).

...