我正在使用蒙版从fft转换后的图像中削减一些频率。

我的代码是:

img = cv2.imread('messi.jpg',0)
rows, cols = img.shape
crow, ccol = rows/2 , cols/2     # center
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)

我的面具是:
# create a mask first, center square is 0, remaining all ones
mask = np.ones((rows, cols, 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 0

然后,将蒙版应用于傅立叶变换后的图像:
fshift = dft_shift*mask

我试图绘制问题,但出现尺寸错误,必须使用下面的代码创建新的遮罩才能打印出来。
printMask = np.ones(img.shape, np.uint8)
printMask[crow-30:crow+30, ccol-30:ccol+30] = 0

我的问题是为什么我们必须在掩码中使用(rows, cols, 2)而不是(rows, cols)。为什么我们需要这两个 channel ?

最佳答案

通常,图像具有1通道(灰度)或3通道(RGB)。因此,应用于它们的蒙版应具有相同数量的通道。

在您的情况下,您要将蒙版应用于傅立叶变换的结果。傅立叶变换是频率的复数值函数。返回的两个通道分别是变换的实部和虚部。如果要在上面加上遮罩,则需要两个通道。

您可以看到cv2.dft的工作方式here

干杯!

关于python - OpenCV/Python:fftimage上的蒙版-为什么我们需要两个 channel ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32951036/

10-11 23:40