- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对这一切都很陌生,我想从图像中获取幅度谱,然后从修改后的幅度谱重建图像..但现在我得到了一个非常暗的重建。
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('IMG.jpg',0)
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
m, a = np.log(cv2.cartToPolar(dft_shift[:,:,0],dft_shift[:,:,1]))
# do somthing with m
x, y = cv2.polarToCart(np.exp(m), a)
back = cv2.merge([x, y])
f_ishift = np.fft.ifftshift(back)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])
plt.subplot(131),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(m, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(img_back, cmap = 'gray')
plt.title('result'), plt.xticks([]), plt.yticks([])
plt.show()
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('IMG.jpg',0)
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
m, a = np.log1p(cv2.cartToPolar(dft_shift[:,:,0],dft_shift[:,:,1]))
# modify m, then use the modify m to reconstruct
x, y = cv2.polarToCart(np.expm1(m), a)
back = cv2.merge([x, y])
f_ishift = np.fft.ifftshift(back)
img_back = cv2.idft(f_ishift, flags=cv2.DFT_SCALE)
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])
min, max = np.amin(img, (0,1)), np.amax(img, (0,1))
print(min,max)
# re-normalize to 8-bits
min, max = np.amin(img_back, (0,1)), np.amax(img_back, (0,1))
print(min,max)
img_back = cv2.normalize(img_back, None, alpha=0, beta=252, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
min, max = np.amin(img_back, (0,1)), np.amax(img_back, (0,1))
print(min,max)
plt.subplot(131),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(m, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(img_back, cmap = 'gray')
plt.title('result'), plt.xticks([]), plt.yticks([])
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
最佳答案
如果您需要通过将其提高到接近 1 的幂来修改幅度(称为系数生根或 alpha 生根),那么这只是使用 Python/OpenCV 对我上面的代码进行的简单修改。在将幅度和相位转换回实部和虚部之前,只需添加 cv2.pow(mag, 1.1)。
输入:
import numpy as np
import cv2
# read input as grayscale
img = cv2.imread('lena.png', 0)
# convert image to floats and do dft saving as complex output
dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)
# apply shift of origin from upper left corner to center of image
dft_shift = np.fft.fftshift(dft)
# extract magnitude and phase images
mag, phase = cv2.cartToPolar(dft_shift[:,:,0], dft_shift[:,:,1])
# get spectrum for viewing only
spec = np.log(mag) / 30
# NEW CODE HERE: raise mag to some power near 1
# values larger than 1 increase contrast; values smaller than 1 decrease contrast
mag = cv2.pow(mag, 1.1)
# convert magnitude and phase into cartesian real and imaginary components
real, imag = cv2.polarToCart(mag, phase)
# combine cartesian components into one complex image
back = cv2.merge([real, imag])
# shift origin from center to upper left corner
back_ishift = np.fft.ifftshift(back)
# do idft saving as complex output
img_back = cv2.idft(back_ishift)
# combine complex components into original image again
img_back = cv2.magnitude(img_back[:,:,0], img_back[:,:,1])
# re-normalize to 8-bits
min, max = np.amin(img_back, (0,1)), np.amax(img_back, (0,1))
print(min,max)
img_back = cv2.normalize(img_back, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
cv2.imshow("ORIGINAL", img)
cv2.imshow("MAG", mag)
cv2.imshow("PHASE", phase)
cv2.imshow("SPECTRUM", spec)
cv2.imshow("REAL", real)
cv2.imshow("IMAGINARY", imag)
cv2.imshow("COEF ROOT", img_back)
cv2.waitKey(0)
cv2.destroyAllWindows()
# write result to disk
cv2.imwrite("lena_grayscale_opencv.png", img)
cv2.imwrite("lena_grayscale_coefroot_opencv.png", img_back)
关于python - 如何使用opencv python反转具有幅度的DFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59975604/
假设一个数字序列(波状数据)。然后我执行 DFT(或 FFT)变换。我想要实现的下一步是找到与数据中包含的实际频率相对应的频率。正如我们所知,DFT 输出具有实部和虚部 a[i] 和 b[i]。如果我
我正在尝试在频域中执行逆滤波和伪逆滤波。 但是我在访问 DFT 系数和之后乘以 DFT 矩阵时遇到问题,因为我得到了复数,因此实际上是两个矩阵...... 基本上逆向过滤执行 F = G/H, 其中
对于我的项目,我必须对大型 2D 输入矩阵进行 DFT,对其进行处理,然后使用 IDFT 将其转换回来,并将结果与输入矩阵进行比较。我的问题出在 2D DFT 步骤中。我使用一个小的简单数据集编写
我有一个场景,我必须从未知的 excel 文件和未知的选项卡中获取数据。所以我创建了一个包含 50 列的表。 问题是进入第二个循环后 ssis 包没有进展。第一个循环获取文件名,第二个循环获取该文件中
我正在尝试用 Java 编写一个小型离散傅立叶变换,以查找清晰的 400 Hz 正弦信号中的幅度谱(1 秒为 pcm 带符号短) 首先我计算复数值的 DFT: public void berechne
我们需要在 GSL 中更改/重新实现标准的 DFT 实现,即 int FUNCTION(gsl_dft_complex,transform) (const BASE data[],
注意:这个问题最初是在 OpenCV forum 上提出的几天前。 我正在构建一个广泛使用二维 dft、离散傅立叶变换的图像处理程序。我正在尝试加速以实时运行。 在该应用程序中,我仅使用由矩形 ROI
我正在编写一个非常简单的就地 DFT。我正在使用此处显示的公式: http://en.wikipedia.org/wiki/Discrete_Fourier_transform#Definition与
我试图通过 Matlab 中的 DFT(数字傅里叶变换)使用相关性来比较 2 个信号的相似程度,但相关函数给出的结果并不是真正可预测的。例如,如果我比较那两对信号: 相关性 1 和 2 相关性 3 和
更多细节:我开始写我的“学士学位论文”这将是与图像压缩相关的东西 我想知道您是否知道有任何尝试使用 PNG 格式的方波傅里叶级数(变换)作为滤波器而不是 haar 小波?会有什么好处吗? 如果您对我的
在这个 DFT 上我一直在用头撞墙。它应该打印出:8,0,0,0,0,0,0,0 但我得到的是 8,然后是非常非常小的数字。这些是舍入误差吗?有什么我可以做的吗?我的 Radix2 FFT 给出了正确
我想要质心的坐标并且我已经计算了 DFT(用于不同的目的)。我看过一些幻灯片,暗示可以通过查看矩阵的第一个值来粗略估计质心。代码基于:http://docs.opencv.org/doc/tutori
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 7 年前。 Improve t
我正在尝试对两个单独的图像进行逐点乘法傅立叶变换,然后再转换回普通图像。我不太熟悉在 OpenCV 中使用傅立叶变换,但这就是我目前所拥有的。显示输出的最后一行导致类型为“System.Runtime
我正在尝试在我的 C++ 代码中使用 FFTW3,并且我想使用 scipy.fftpack.fft 在 python 中完成同样的事情 用于真正的一维信号。我只是制作一维信号并从信号中找到频率。我不知
我正在进行一项作业,以 20kHz 的采样频率对频率为 500Hz 的方波执行 200 点 DFT,其幅度在 0 和 20 之间交替。 我正在使用 C++,我已经想出了如何编写 DFT 方程的代码,我
我最近在我的 Ubuntu 16.04 机器上重新编译了 OpenCV 3.2.0 以包含 CUDA。出于某种原因,cv::dft() 现在对特定图像大约需要 30 秒,而不是编译前的 5 秒。这是灾
我正在研究图像频率过滤的 GPU 实现。我的代码在 CPU 上运行良好(我使用了类似 this 的东西),但我花了一整天时间尝试在 GPU 上进行同样的工作——但没有成功。我想在频域中应用一个滤波器,
我创建了一个简单的积分函数和 DFT 函数,可以将它们与我编写的其他代码一起使用。 from math import sin,pi from time import time def aintegra
我使用以下代码计算图像与指定内核(在我的例子中是高斯内核)的卷积。每次我得到不同的结果,结果图像甚至不接近我在空间域中通过卷积获得的图像。首先我认为问题出在图像的数据类型上。我将它们更改为 32 和
我是一名优秀的程序员,十分优秀!