频域x方向卷积sobel算子

2024-03-29 09:35:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我实现了代码given by Cris Luengo for convolution in frequency in domain,但是没有得到x方向的预期渐变图像。你知道吗

不在x和y方向翻转内核的图像:

Image with normal kernel

翻转内核后的图像:

enter image description here

如果您注意到,第二个图像与枕头库中的ImageKernel过滤器给出的图像相同。另外,需要注意的一点是,如果我在y方向上应用Sobel内核,我不必翻转内核,我得到的是准确的预期图像。你知道吗

这是我的密码:

import numpy as np
from scipy import misc
from scipy import fftpack
import matplotlib.pyplot as plt
from PIL import Image,ImageDraw,ImageOps,ImageFilter
from pylab import figure, title, imshow, hist, grid,show

im1=Image.open("astronaut.png").convert('L') 
# im1=ImageOps.grayscale(im1)
img=np.array(im1)

# kernel = np.ones((3,3)) / 9
# kernel=np.array([[0,-1,0],[-1,4,-1],[0,-1,0]])
kernel=np.array([[-1,0,1],[-2,0,2],[-1,0,1]])
kernel=np.rot90(kernel,2)
print(kernel)

sz = (img.shape[0] - kernel.shape[0], img.shape[1] - kernel.shape[1])  # total 
amount of padding
kernel = np.pad(kernel, (((sz[0]+1)//2, sz[0]//2), ((sz[1]+1)//2, sz[1]//2)), 
'constant')

kernel = fftpack.ifftshift(kernel)

filtered = np.real(fftpack.ifft2(fftpack.fft2(img) * 
fftpack.fft2(kernel)))+np.imag(fftpack.ifft2(fftpack.fft2(img) * 
fftpack.fft2(kernel)))
filtered=np.maximum(0,np.minimum(filtered,255))
im2=Image.open("astronaut.png").convert('L')

u=im2.filter(ImageFilter.Kernel((3,3), [-1,0,1,-2,0,2,-1,0,1], 
scale=1, offset=0))

fig2=figure()

ax1 = fig2.add_subplot(221)  
ax2 = fig2.add_subplot(222)
ax3 = fig2.add_subplot(223)

ax1.title.set_text('Original Image')
ax2.title.set_text('After convolving in freq domain')
ax3.title.set_text('imagefilter conv')
ax1.imshow(img,cmap='gray')
ax2.imshow(filtered,cmap='gray')
ax3.imshow(np.array(u),cmap='gray')

show()

Tags: from图像imageimportimgtitlenparray