def dft(path):
img=cv2.imread(path,0)
if img is None:
print('load img fail\n')
return
dst=cv2.dft(np.float32(img),flags=cv2.DFT_COMPLEX_OUTPUT)
dst_center=np.fft.fftshift(dst)#将高频移动到中间
rows,cols = img.shape
# 定义掩模:生成的掩模中间为1周围为0
crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得图像的中心点位置
mask = np.zeros((img.shape[0], img.shape[1], 2), np.uint8)
mask[::] = 1
mask[int(rows/2):int(rows/2 + 1),:] = 0
mask[int(rows/2):int(rows/2 + 1),ccol-int(ccol/32):ccol+int(ccol/32)] = 1
dst_center = dst_center*mask
result=20*np.log(cv2.magnitude(dst_center[:,:,0],dst_center[:,:,1]))
# 使用np.fft.ifftshift将低频移动到原来的位置
dst_origin = np.fft.ifftshift(dst_center)
# 使用cv2.idft进行傅里叶的逆变化
img_idft = cv2.idft(dst_origin)
# 使用cv2.magnitude转化为空间域内
img_idft = cv2.magnitude(img_idft[:, :, 0], img_idft[:, :, 1],(rows,cols))
# 显示图像
plt.subplot(131)
plt.imshow(img, cmap="gray")
plt.axis("off")
plt.title('origin')
plt.subplot(132)
plt.imshow(result, cmap="gray")
plt.axis("off")
plt.title('dft')
plt.subplot(133)
plt.axis("off")
plt.imshow(img_idft, cmap=plt.cm.gray)
plt.title('idft')
plt.show()
首先加载图像,然后进行dft计算频谱图,之后使用掩膜,将竖条纹的频谱信号去除,再逆变换还原为图像,示例图像中为竖向条纹,在频谱图中表现在X轴上
结果如下
中间需要保留通过的半径根据需要调整,我的代码中写为了图像宽度的1/16文章来源:https://www.toymoban.com/news/detail-861288.html
以此篇文章作为学习记录文章来源地址https://www.toymoban.com/news/detail-861288.html
到了这里,关于在python中使用opencv进行dft和idft去除图像条纹的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!