Python OpenCV实现巴特沃斯低通滤波时过滤器无法生效如何解决
问题原因
你遇到的赋值失效问题完全是数据类型不匹配导致的:
你声明lpFilter_matrix时指定了np.uint8类型,这种无符号8位整数只能存储0255的整数值,而你计算得到的`lpFilter`所有取值都在01区间内,浮点数赋值给uint8数组时会被自动截断取整,所以所有值都会变成0。
修复方法
仅需要修改lpFilter_matrix的声明代码,将数据类型替换为支持浮点数的np.float32即可:
# 把原来的np.uint8改成np.float32 lpFilter_matrix = np.zeros((rows, cols, 2), np.float32)
修正后完整可运行代码
import cv2 import numpy as np from matplotlib import pyplot as plt image=cv2.imread(r"C:/Users/Admin/Pictures/eee.jpg",0) image_float32=np.float32(image) dft =cv2.dft(image_float32,flags=cv2.DFT_COMPLEX_OUTPUT) dft_shift=np.fft.fftshift(dft) magnitude_spectrum=np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1])) rows, cols = image.shape crow, ccol = rows//2 , cols//2 r, c = np.mgrid[0:rows:1, 0:cols:1] c -= crow r -= ccol d = np.sqrt(np.power(r, 2.0) + np.power(c, 2.0)) # 这里修改了数据类型 lpFilter_matrix = np.zeros((rows, cols, 2), np.float32) d0=10 n=2 lpFilter = 1.0 / (1 + np.power(d/d0, 2*n)) lpFilter_matrix[:, :, 0] = lpFilter lpFilter_matrix[:, :, 1] = lpFilter fshift = dft_shift*lpFilter_matrix f_ishift = np.fft.ifftshift(fshift) img_back = cv2.idft(f_ishift) img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1]) plt.figure(figsize=(14,9)) plt.subplot(121) plt.imshow(image, cmap = 'gray') plt.title('Input Image') plt.axis('off') plt.subplot(122) plt.imshow(img_back, cmap = 'gray') plt.title('filtered Image') plt.axis('off') plt.show()
内容的提问来源于stack exchange,提问作者Aya Ibrahim
相关产品推荐
相关产品推荐

