Сверточный оператор sobel в направлении x в частотной области - PullRequest
0 голосов
/ 04 марта 2019

Я реализовал код , данный Крисом Луенго для свертки по частоте в области , однако я не получаю предполагаемое градиентное изображение в направлении x.

Изображение без переворачивания ядра внаправление x и y:

Image with normal kernel

Изображение после переворачивания ядра:

enter image description here

Если вы заметили, второе изображение такое жекак указано ImageKernel фильтром из библиотеки подушек.Кроме того, следует отметить, что мне не нужно переворачивать ядро, если я применяю ядро ​​Собеля в направлении y, я получаю именно то, что нам нужно.

Это мой код:

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()
...