Python 使用openCV显示DFT输出时出现问题';s imshow

Python 使用openCV显示DFT输出时出现问题';s imshow,python,numpy,opencv,image-processing,Python,Numpy,Opencv,Image Processing,我按照上的教程,在python中使用NumPy和OpenCV创建了一个低通过滤器。我没有像教程中那样使用pyplot显示转换后的图像,而是尝试使用OpenCV的imshow函数,但没有得到所需的输出 img = cv2.imread('./lenna.jpg', 0) img = np.array(img) dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT) dft_shift = np.fft.fftshift(dft

我按照上的教程,在python中使用NumPy和OpenCV创建了一个低通过滤器。我没有像教程中那样使用pyplot显示转换后的图像,而是尝试使用OpenCV的imshow函数,但没有得到所需的输出

img = cv2.imread('./lenna.jpg', 0)
img = np.array(img)


dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)

rows, cols = img.shape
crow,ccol = int(rows/2) , int(cols/2)

mask = np.zeros((rows,cols,2),np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1

fshift = dft_shift*mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])

cv2.imshow('before', img)
cv2.imshow('after', img_back)
cv2.waitKey(0)

有人能帮我理解我做错了什么吗?输出映像的数据类型是否错误


如果要以np.float32类型显示数据,必须将其标准化为1.0

img_back = cv2.normalize(img_back, None, alpha=0, beta=1.0, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)

如果要以np.float32类型显示数据,必须将其规格化为1.0

img_back = cv2.normalize(img_back, None, alpha=0, beta=1.0, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)

imshow
要求浮动在0的范围内。。1正确显示(或uint8在0..255范围内)

执行以下操作以读取图像:

img=cv2.imread('./lenna.jpg')
img=img/np.float32(255)
我建议不要使用cv2。使用NORM_MINMAX规范化,因为这会改变图片的整体对比度,而这不是您需要(或想要)的


此外,我建议获得复杂结果的真实成分。不要采用大小。

imshow
预计浮动范围为0。。1正确显示(或uint8在0..255范围内)

执行以下操作以读取图像:

img=cv2.imread('./lenna.jpg')
img=img/np.float32(255)
我建议不要使用cv2。使用NORM_MINMAX规范化,因为这会改变图片的整体对比度,而这不是您需要(或想要)的


此外,我建议获得复杂结果的真实成分。不要采用大小。

OpenCV的FFT函数要求将缩放标志
DFT\u SCALE
精确指定给
DFT、idft
中的一个。请参阅

我选择在第一个函数中传递它,因为它已经接受了另一个标志

numpy的fft2函数不需要这个。他们按原样工作

这两个版本仅在
dft/idft
fft2/ifft2
方面有所不同

导入操作系统
导入系统
将numpy作为np导入
将cv2作为cv导入
def准备_光谱(光谱):
mag=np.linalg.norm(光谱,轴=2)
磁力/=磁力最大值()
mag**=1/4
回传杂志
img=cv.imread(cv.samples.findFile(“lena.jpg”),cv.imread\u灰度)
img=img/np.float32(255)
dft=cv.dft(img,flags=cv.dft_复数_输出| cv.dft_刻度)
cv.imshow(“1 dft”,准备频谱(dft))
dft_shift=np.fft.fft移位(dft)
cv.imshow(“2 dft\U移位”,准备频谱(dft\U移位))
行,列=img.shape
crow,ccol=(行//2),(列//2)
掩码=np.zero((行,列,2),数据类型=np.uint8)
遮罩[crow-30:crow+30,ccol-30:ccol+30]=1
dft_移位*=掩码
cv.imshow(“3 dft\u移位屏蔽”,准备频谱(dft\u移位))
dft=np.fft.ifftshift(dft\U移位)
cv.imshow(“4个dft屏蔽”,准备频谱(dft))
img_back=cv.idft(干膜厚度)
img_back=img_back[:,:,0]#实部
cv.imshow(“之前”,img)
cv.imshow(“之后”,img\U后)
cv.waitKey()
cv.destroyAllWindows()
努比:

导入操作系统
导入系统
将numpy作为np导入
将cv2作为cv导入
def准备_光谱(光谱):
mag=np.abs(光谱)
磁力/=磁力最大值()
mag**=1/4
回传杂志
img=cv.imread(cv.samples.findFile(“lena.jpg”),cv.imread\u灰度)
img=img/np.float32(255)
dft=np.fft.fft2(img)
cv.imshow(“1 dft”,准备频谱(dft))
dft_shift=np.fft.fft移位(dft)
cv.imshow(“2 dft\U移位”,准备频谱(dft\U移位))
行,列=img.shape
crow,ccol=(行//2),(列//2)
掩码=np.zero((行,列),数据类型=np.uint8)
遮罩[crow-30:crow+30,ccol-30:ccol+30]=1
dft_移位*=掩码
cv.imshow(“3 dft\u移位屏蔽”,准备频谱(dft\u移位))
dft=np.fft.ifftshift(dft\U移位)
cv.imshow(“4个dft屏蔽”,准备频谱(dft))
img_back=np.fft.ifft2(dft)
img\u back=np.real(img\u back)
cv.imshow(“之前”,img)
cv.imshow(“之后”,img\U后)
cv.waitKey()
cv.destroyAllWindows()

OpenCV的FFT函数要求将缩放标志
DFT\u SCALE
精确指定给
DFT、idft
中的一个。请参阅

我选择在第一个函数中传递它,因为它已经接受了另一个标志

numpy的fft2函数不需要这个。他们按原样工作

这两个版本仅在
dft/idft
fft2/ifft2
方面有所不同

导入操作系统
导入系统
将numpy作为np导入
将cv2作为cv导入
def准备_光谱(光谱):
mag=np.linalg.norm(光谱,轴=2)
磁力/=磁力最大值()
mag**=1/4
回传杂志
img=cv.imread(cv.samples.findFile(“lena.jpg”),cv.imread\u灰度)
img=img/np.float32(255)
dft=cv.dft(img,flags=cv.dft_复数_输出| cv.dft_刻度)
cv.imshow(“1 dft”,准备频谱(dft))
dft_shift=np.fft.fft移位(dft)
cv.imshow(“2 dft\U移位”,准备频谱(dft\U移位))
行,列=img.shape
crow,ccol=(行//2),(列//2)
掩码=np.zero((行,列,2),数据类型=np.uint8)
遮罩[crow-30:crow+30,ccol-30:ccol+30]=1
dft_移位*=掩码
cv.imshow(“3 dft\u移位屏蔽”,准备频谱(dft\u移位))
dft=np.fft.ifftshift(dft\U移位)
cv.imshow(“4个dft屏蔽”,准备频谱(dft))
img_back=cv.idft(干膜厚度)
img_back=img_back[:,:,0]#实部
cv.imshow(“之前”,img)
cv.imshow(“之后”,img\U后)
cv.waitKey()
cv.destroyAllWindows()
努比:

导入操作系统
导入系统
将numpy作为np导入
将cv2作为cv导入
def准备_光谱(光谱):
mag=np.abs(光谱)
磁力/=磁力最大值()
mag**=1/4
回传杂志
img=cv.imread(cv.samples.findFile(“lena.jpg”),cv.imread\u灰度)
img=img/np.float32(255)
dft=np.fft.fft2(img)
cv.imshow(“1 dft”,准备频谱(dft))
dft_shift=np.fft.fft移位(dft)
cv.imshow(“2 dft\U移位”,准备频谱(dft\U移位))
行,列=img.shape
crow,ccol=(行//2),(列//2)
掩码=np.zero((行,列),数据类型=np.uint8)
遮罩[crow-30:crow+30,ccol-30:ccol+30]=1
dft_移位*=掩码
cv.imshow(“3 dft\u移位屏蔽”,准备频谱(dft\u移位))
dft=np.fft.ifftshift(dft\U移位)
cv.imshow(“4个dft屏蔽”,准备频谱(dft))
感应电动机