scikit-image Gabor filter error: `filter weights array has incorrect shape`
scikit-image Gabor filter error: `filter weights array has incorrect shape`
输入是灰度图像,转换为 130x130 numpy 矩阵。我总是收到错误消息:
Traceback (most recent call last):
File "test_final.py", line 87, in <module>
a._populate_gabor()
File "C:\Users\Bears\Dropbox\School\Data Science\final.py", line 172, in _populate_gabor
self.gabor_imgs[i] = self._matrix_2_1d(self._gabor_this(self.grey_imgs[i]),kernels[0])
File "C:\Users\Bears\Dropbox\School\Data Science\final.py", line 179, in _gabor_this
filtered = ndi.convolve(image, kernel, mode='reflect')
File "C:\Users\Bears\Anaconda3\lib\site-packages\scipy\ndimage\filters.py", line 696, in convolve
origin, True)
File "C:\Users\Bears\Anaconda3\lib\site-packages\scipy\ndimage\filters.py", line 530, in _correlate_or_convolve
raise RuntimeError('filter weights array has incorrect shape.')
RuntimeError: filter weights array has incorrect shape.
我的代码如下
def _populate_gabor(self):
kernels = []
for theta in range(self.gabor_range[0],self.gabor_range[1]):
theta = theta / 4. * np.pi
for sigma in (1, 3):
for frequency in (0.05, 0.25):
kernel = np.real(gabor_kernel(frequency, theta=theta,
sigma_x=sigma, sigma_y=sigma))
kernels.append(kernel)
print (len(kernels))
for i in range(self.length):
self.gabor_imgs[i] = self._matrix_2_1d(self._gabor_this(self.grey_imgs[i]),kernels[0])
def _gabor_this(image, kernels):
feats = np.zeros((len(kernels), 2), dtype=np.double)
for k, kernel in enumerate(kernels):
filtered = ndi.convolve(image, kernel, mode='reflect')
feats[k, 0] = filtered.mean()
feats[k, 1] = filtered.var()
return feats
我直接从 http://scikit-image.org/docs/dev/auto_examples/plot_gabor.html 的示例中获取了这段代码,但我不知道如何解决这个错误。任何帮助,将不胜感激。
请注意,所有其他功能都与其他过滤器一起使用,而不是 gabor。
您好像在使用 scipy 中的 'ndimage.convolve' 函数。请记住,ndimage 提供了 "N" 维度卷积。所以如果你想让卷积起作用,图像和核必须有相同的维数。其中任何一个尺寸不正确都会导致您描述的错误。
根据您上面的评论,内核 (4,4,7) 无法与图像 (130,130) 进行卷积。尝试在卷积之前添加一个单一维度,然后在之后删除它。
img = np.zeros(shape=(130,130),dtype=np.float32)
img = img[:,:,None] # Add singleton dimension
result = convolve(img,kernel)
finalOutput = result.squeeze() # Remove singleton dimension
这是一个关于如何使用 ndimage.convole 对 RGB 图像(3 通道图像)应用滤镜的示例):
import cv2
import numpy as np
from PIL import Image
from pylab import plt
from scipy import ndimage
# Partly based on
# Load an rgb image
img_in = np.array(Image.open("a_256x256_rgb_image.bmp")).reshape(256, 256, 3)
rgb_kernel = np.ones((5, 5, 3))
# A highpass filter
single_chan_kernel = np.array(
[
[-1, -1, -1, -1, -1], # nopep8
[-1, 1, 2, 1, -1], # nopep8
[-1, 2, 4, 2, -1], # nopep8
[-1, 1, 2, 1, -1], # nopep8
[-1, -1, -1, -1, -1],
] # nopep8
) # nopep8
rgb_kernel[:, :, 0] = single_chan_kernel
rgb_kernel[:, :, 1] = single_chan_kernel
rgb_kernel[:, :, 2] = single_chan_kernel
filtered_img = ndimage.convolve(img_in, rgb_kernel)
im = plt.imshow(filtered_img)
plt.show()
输入是灰度图像,转换为 130x130 numpy 矩阵。我总是收到错误消息:
Traceback (most recent call last):
File "test_final.py", line 87, in <module>
a._populate_gabor()
File "C:\Users\Bears\Dropbox\School\Data Science\final.py", line 172, in _populate_gabor
self.gabor_imgs[i] = self._matrix_2_1d(self._gabor_this(self.grey_imgs[i]),kernels[0])
File "C:\Users\Bears\Dropbox\School\Data Science\final.py", line 179, in _gabor_this
filtered = ndi.convolve(image, kernel, mode='reflect')
File "C:\Users\Bears\Anaconda3\lib\site-packages\scipy\ndimage\filters.py", line 696, in convolve
origin, True)
File "C:\Users\Bears\Anaconda3\lib\site-packages\scipy\ndimage\filters.py", line 530, in _correlate_or_convolve
raise RuntimeError('filter weights array has incorrect shape.')
RuntimeError: filter weights array has incorrect shape.
我的代码如下
def _populate_gabor(self):
kernels = []
for theta in range(self.gabor_range[0],self.gabor_range[1]):
theta = theta / 4. * np.pi
for sigma in (1, 3):
for frequency in (0.05, 0.25):
kernel = np.real(gabor_kernel(frequency, theta=theta,
sigma_x=sigma, sigma_y=sigma))
kernels.append(kernel)
print (len(kernels))
for i in range(self.length):
self.gabor_imgs[i] = self._matrix_2_1d(self._gabor_this(self.grey_imgs[i]),kernels[0])
def _gabor_this(image, kernels):
feats = np.zeros((len(kernels), 2), dtype=np.double)
for k, kernel in enumerate(kernels):
filtered = ndi.convolve(image, kernel, mode='reflect')
feats[k, 0] = filtered.mean()
feats[k, 1] = filtered.var()
return feats
我直接从 http://scikit-image.org/docs/dev/auto_examples/plot_gabor.html 的示例中获取了这段代码,但我不知道如何解决这个错误。任何帮助,将不胜感激。 请注意,所有其他功能都与其他过滤器一起使用,而不是 gabor。
您好像在使用 scipy 中的 'ndimage.convolve' 函数。请记住,ndimage 提供了 "N" 维度卷积。所以如果你想让卷积起作用,图像和核必须有相同的维数。其中任何一个尺寸不正确都会导致您描述的错误。
根据您上面的评论,内核 (4,4,7) 无法与图像 (130,130) 进行卷积。尝试在卷积之前添加一个单一维度,然后在之后删除它。
img = np.zeros(shape=(130,130),dtype=np.float32)
img = img[:,:,None] # Add singleton dimension
result = convolve(img,kernel)
finalOutput = result.squeeze() # Remove singleton dimension
这是一个关于如何使用 ndimage.convole 对 RGB 图像(3 通道图像)应用滤镜的示例):
import cv2
import numpy as np
from PIL import Image
from pylab import plt
from scipy import ndimage
# Partly based on
# Load an rgb image
img_in = np.array(Image.open("a_256x256_rgb_image.bmp")).reshape(256, 256, 3)
rgb_kernel = np.ones((5, 5, 3))
# A highpass filter
single_chan_kernel = np.array(
[
[-1, -1, -1, -1, -1], # nopep8
[-1, 1, 2, 1, -1], # nopep8
[-1, 2, 4, 2, -1], # nopep8
[-1, 1, 2, 1, -1], # nopep8
[-1, -1, -1, -1, -1],
] # nopep8
) # nopep8
rgb_kernel[:, :, 0] = single_chan_kernel
rgb_kernel[:, :, 1] = single_chan_kernel
rgb_kernel[:, :, 2] = single_chan_kernel
filtered_img = ndimage.convolve(img_in, rgb_kernel)
im = plt.imshow(filtered_img)
plt.show()