图像中的Gabors/初级视觉皮层“简单细胞”

如何建立一个(生物似是而非) 稀疏 字典(或‘码本’,或‘滤波器库’),例如,图像分类,没有任何花哨的数学,只有标准的 Python 科学库?

请在下面找到简短的答案;-)

这个简单的例子展示了如何获得类似Gabor的滤光片 1 只用了一张简单的图片。在我们的例子中,我们使用了宇航员艾琳·柯林斯的照片。Gabor滤波器是“简单细胞”的很好近似。 2 接受场 3 发现于哺乳动物的初级视觉皮质(V1)(详情见Hubel&Wiseel在60年代完成的诺贝尔奖获奖作品 4 5 )。

这里我们使用的是麦昆的“KMeans”算法 6, 作为一个简单的生物学上可信的类Hebbian学习规则,我们将其(A)应用于原始图像的斑块(视网膜投影),以及(B)应用于类LGN的斑块 7 图像采用简单的高斯差(狗)近似。

享受;-)记住,让Gabors出现在自然图像补丁上并不是一项火箭科学。

1

https://en.wikipedia.org/wiki/Gabor_filter

2

https://en.wikipedia.org/wiki/Simple_cell

3

https://en.wikipedia.org/wiki/Receptive_field

4

D.H.Hubel和T.N.,猫纹状皮质中单个神经元的威塞尔感受场,J.Physiol。第574-591(148)页1959

5

胡贝尔和T.N,猫的视觉皮质中的威塞尔感受野、双眼相互作用和功能结构,J.Physiol。160页。106-154 1962

6

https://en.wikipedia.org/wiki/K-means_clustering

7

https://en.wikipedia.org/wiki/Lateral_geniculate_nucleus

Image (original), K-means filterbank (codebook) on original image, Image (LGN-like DoG), K-means filterbank (codebook) on LGN-like DoG image

输出:

/vpy/lib/python3.9/site-packages/scipy/cluster/vq.py:607: UserWarning:

One of the clusters is empty. Re-run kmeans with a different initialization.

import numpy as np
from scipy.cluster.vq import kmeans2
from scipy import ndimage as ndi
import matplotlib.pyplot as plt

from skimage import data
from skimage import color
from skimage.util.shape import view_as_windows
from skimage.util import montage

np.random.seed(42)

patch_shape = 8, 8
n_filters = 49

astro = color.rgb2gray(data.astronaut())

# -- filterbank1 on original image
patches1 = view_as_windows(astro, patch_shape)
patches1 = patches1.reshape(-1, patch_shape[0] * patch_shape[1])[::8]
fb1, _ = kmeans2(patches1, n_filters, minit='points')
fb1 = fb1.reshape((-1,) + patch_shape)
fb1_montage = montage(fb1, rescale_intensity=True)

# -- filterbank2 LGN-like image
astro_dog = ndi.gaussian_filter(astro, .5) - ndi.gaussian_filter(astro, 1)
patches2 = view_as_windows(astro_dog, patch_shape)
patches2 = patches2.reshape(-1, patch_shape[0] * patch_shape[1])[::8]
fb2, _ = kmeans2(patches2, n_filters, minit='points')
fb2 = fb2.reshape((-1,) + patch_shape)
fb2_montage = montage(fb2, rescale_intensity=True)

# -- plotting
fig, axes = plt.subplots(2, 2, figsize=(7, 6))
ax = axes.ravel()

ax[0].imshow(astro, cmap=plt.cm.gray)
ax[0].set_title("Image (original)")

ax[1].imshow(fb1_montage, cmap=plt.cm.gray)
ax[1].set_title("K-means filterbank (codebook)\non original image")

ax[2].imshow(astro_dog, cmap=plt.cm.gray)
ax[2].set_title("Image (LGN-like DoG)")

ax[3].imshow(fb2_montage, cmap=plt.cm.gray)
ax[3].set_title("K-means filterbank (codebook)\non LGN-like DoG image")

for a in ax.ravel():
    a.axis('off')

fig.tight_layout()
plt.show()

脚本的总运行时间: (0分0.988秒)

Gallery generated by Sphinx-Gallery