感觉系统/计算机模型/视觉信息处理的描述性模拟
在本节中,将概述早期视觉系统水平进行的处理模拟。为了再现视觉系统的活动,实现将使用 MATLAB 及其工具箱。之前已讨论了早期视觉系统完成的处理,并且可以在以下示意图概述中将其与它们执行的一些功能结合在一起。在 (Cormack 2000) 中可以找到对图像处理的良好描述。
正如我们在上面概述中看到的,为了模拟视觉系统对刺激的响应,必须考虑图像处理的不同阶段。因此,下一节将简要讨论图像处理。但首先,我们将关注感觉器官组件的模拟。
平均眼睛的角膜前曲率半径为 = 7.8 毫米,水性液体的折射率为 1.336。眼睛的长度为 = 24.2 毫米。虹膜近似扁平,虹膜边缘(也称为角膜缘)的半径为 = 5.86 毫米。
眼球的光学特征在于其二维空间冲激响应函数,即点扩散函数 (PSF)
其中 是图像中心以弧分计的径向距离。
显然,对给定数字图像的影响取决于该图像与您眼睛的距离。作为简单的占位符,用高度为 30、标准差为 1.5 的高斯滤波器替换此滤波器。
在一维中,高斯分布由以下公式描述
神经节细胞的活动
[edit | edit source]忽略
- 时间响应
- 波长效应(尤其是锥体细胞)
- 虹膜的开口
- 感光受体的采样和分布
- 感光色素的漂白
我们可以用高斯差(DOG,维基百科 [1])来近似神经节细胞的响应。
Python 实现的源代码可在 [1] 中找到。
和 的比率大约为 1:1.6,但会随着偏心率的变化而变化。对于小细胞(或 P 细胞),感受野大小(RFS)大约为
对于 M 细胞大约为
其中 RFS 以角分表示,偏心率以从中央凹中心到该点的毫米距离表示(Cormack 2000)。
初级视觉皮层(V1)中简单细胞的活动
[edit | edit source]再次忽略时间属性,初级视觉皮层(V1)中简单细胞的活动可以用 Gabor 滤波器(维基百科 [2])来模拟。Gabor 滤波器是一种线性滤波器,其冲激响应由一个谐波函数(正弦波)乘以一个高斯函数定义。高斯函数导致谐波函数的振幅远离原点而衰减,但在原点附近,谐波函数的特性占主导地位。
其中
和
在这个等式中, 代表余弦因子的波长, 代表 Gabor 函数(维基百科 [3])平行条纹法线的方向, 是相位偏移, 是高斯包络的 sigma, 是空间纵横比,指定 Gabor 函数的支持的椭圆率。
简单细胞感受野的大小取决于它相对于中央凹的位置,但不像视网膜神经节细胞那样严格。最小的感受野,位于中央凹及其附近,大约为四分之一度乘四分之一度,中心区域小至几分钟的弧度(与视网膜神经节细胞中最小的感受野中心的直径相同)。在视网膜外围,简单细胞感受野可以达到大约 1 度乘 1 度。 [2].
Gabor 函数自然产生,仅仅源于日常场景的统计数据 [3]. 一个例子说明即使一个简单图像的统计数据也可以导致 Gabor 类似感受野的出现,用 Python 编写的,在 [4] 中展示;以及 (Python-) 使用 Gabor 函数对图像进行滤波效果的演示可以在 [5] 中找到。
这是一个在 MATLAB 中实现的示例
function gb = gabor_fn(sigma,theta,lambda,psi,gamma)
sigma_x = sigma;
sigma_y = sigma/gamma;
% Bounding box
nstds = 3;
xmax = max(abs(nstds*sigma_x*cos(theta)),abs(nstds*sigma_y*sin(theta)));
xmax = ceil(max(1,xmax));
ymax = max(abs(nstds*sigma_x*sin(theta)),abs(nstds*sigma_y*cos(theta)));
ymax = ceil(max(1,ymax));
xmin = -xmax;
ymin = -ymax;
[x,y] = meshgrid(xmin:0.05:xmax,ymin:0.05:ymax);
% Rotation
x_theta = x*cos(theta) + y*sin(theta);
y_theta = -x*sin(theta) + y*cos(theta);
gb = exp(-.5*(x_theta.^2/sigma_x^2+y_theta.^2/sigma_y^2)).* cos(2*pi/lambda*x_theta+psi);
end
等效的 Python 实现将是
import numpy as np
import matplotlib.pyplot as mp
def gabor_fn(sigma = 1, theta = 1, g_lambda = 4, psi = 2, gamma = 1):
# Calculates the Gabor function with the given parameters
sigma_x = sigma
sigma_y = sigma/gamma
# Boundingbox:
nstds = 3
xmax = max( abs(nstds*sigma_x * np.cos(theta)), abs(nstds*sigma_y * np.sin(theta)) )
ymax = max( abs(nstds*sigma_x * np.sin(theta)), abs(nstds*sigma_y * np.cos(theta)) )
xmax = np.ceil(max(1,xmax))
ymax = np.ceil(max(1,ymax))
xmin = -xmax
ymin = -ymax
numPts = 201
(x,y) = np.meshgrid(np.linspace(xmin, xmax, numPts), np.linspace(ymin, ymax, numPts) )
# Rotation
x_theta = x * np.cos(theta) + y * np.sin(theta)
y_theta = -x * np.sin(theta) + y * np.cos(theta)
gb = np.exp( -0.5* (x_theta**2/sigma_x**2 + y_theta**2/sigma_y**2) ) * \
np.cos( 2*np.pi/g_lambda*x_theta + psi )
return gb
if __name__ == '__main__':
# Main function: calculate Gabor function for default parameters and show it
gaborValues = gabor_fn()
mp.imshow(gaborValues)
mp.colorbar()
mp.show()
图像处理
[edit | edit source]一个重要的技术工具是了解计算机如何处理图像。我们必须了解如何编辑图像以及我们有哪些技术可以重新排列图像。
图像表示
[edit | edit source]灰度
[edit | edit source]对于计算机来说,图像只不过是一堆小方块。这些方块被称为“像素”。在灰度图像中,每个像素都带有一个数字 n,通常是 。这个数字 n 代表了图像中该方块的精确颜色。这意味着,在灰度图像中,我们可以使用 256 种不同的灰度,其中 255 代表白色点,0 代表该方块是黑色。说实话,我们甚至可以使用超过 256 种不同的灰度。以这种方式,每个像素使用正好 1 个字节(或 8 位)的内存来保存。(由于计算机的二进制系统,它持有:28=256)如果你认为在你的图像中需要更多不同的灰度,这不是问题。你只需使用更多内存来保存图片即可。但请记住,对于大型图像来说,这可能是一个艰巨的任务。此外,你经常会遇到这样的问题,你的传感设备(例如你的显示器)无法显示超过 256 种不同的灰度颜色。
颜色
[edit | edit source]表示彩色图像比灰度图像只复杂一点点。你只需要知道计算机使用三种主要颜色红色、绿色和蓝色的加色混合。这就是所谓的 RGB 颜色。
这些图像也是由像素保存的。但现在每个像素必须知道 3 个 0 到 256 之间的值,每种颜色 1 个值。因此,我们现在有 2563= 16,777,216 种不同的颜色可以表示。与灰度图像类似,这里也成立,没有颜色意味着黑色,所有颜色都意味着白色。也就是说,颜色 (0,0,0) 是黑色,而 (0,0,255) 意味着蓝色,(255,255,255) 是白色。
方向
[edit | edit source]警告 - 有两种常见的、但不同的方法来描述二维空间中点的定位:1) x/y 符号,x 通常指向左侧 2) 行/列方向 请仔细注意你使用哪种坐标来描述你的数据,因为这两种描述不一致!
图像滤波
[edit | edit source]一维滤波器
[edit | edit source]在许多技术应用中,我们发现一些简单的基底,我们可以很容易地用它来描述特征。在一维情况下,滤波器并不是什么大问题,因此我们可以使用这些滤波器来改变图像。所谓的“Savitzky- Golay 滤波器”允许平滑传入的信号。该滤波器由 Abraham Savitzky 和 Marcel J. E. Golay 于 1964 年描述。它是一个冲激响应滤波器 (IR)。
为了更好地理解,让我们看一个例子。在 1 维情况下,我们通常处理向量。我们有一个给定的向量,称为 x,它包含:。我们的目的是平滑这个向量 x。为此,我们只需要另一个向量 ,这个向量我们称为权重向量。
使用 ,我们现在得到了一个平滑的向量 y。这个向量比之前的向量更平滑,因为我们只保存了向量中几个元素的平均值。这意味着新找到的向量元素依赖于要平滑的元素左右的几个元素。这种方法的一个主要缺点是,新找到的向量 y 只有 n-m 个元素,而不是原始向量 x 的 n 个元素。
绘制这个新向量将导致与之前相同的函数,只是幅度更小。因此没有数据丢失,但波动更小。
2D 滤波器
[edit | edit source]从 1 维情况到 2 维情况的转换是通过简单地将向量转换成矩阵来实现的。如前所述,对于计算机或像 MATLAB 这样的软件工具,灰度图像不过是一个充满了自然数(通常在 0 到 255 之间)的巨大矩阵。
权重向量现在变成了权重矩阵。但我们仍然通过将不同的矩阵元素乘积相加来使用滤波器。
膨胀和腐蚀
[edit | edit source]对于前面看到的线性滤波器,它们是可交换的。引用维基百科:如果 x 与 y 在 ∗ 下满足:
换句话说,使用多少个不同的线性滤波器以及使用顺序并不重要。例如,如果对一些数据应用一个 Savitzky-Golay 滤波器,然后应用另一个 Savitzky-Golay 滤波器来计算一阶导数,那么如果滤波器顺序颠倒,结果将是一样的。甚至可以认为,存在一个滤波器,可以实现与应用的两个滤波器相同的效果。
相反,对图像进行形态学操作是非线性操作,最终结果取决于操作顺序。如果我们将任何图像视为由像素值 xij 定义的。此外,假设这个图像是一个黑白图像,因此我们有
为了定义形态学操作,我们必须设置一个结构元素 SE。例如,图像中的一个 3x3 矩阵。
腐蚀 E 的定义是
因此,换句话说,如果任何结构元素 M 中的像素值为 0,则腐蚀操作将 M(M 中的特定像素)的值设置为 0。否则 E(M)=1
对于膨胀 D,如果 SE 中任何值为 1,则 M 的膨胀 D(M) 被设置为 1。
- .
膨胀和腐蚀的组合:图像的开运算和闭运算
[edit | edit source]膨胀和腐蚀有两种组合,一种称为开运算,另一种称为闭运算。它包含以下内容
参考文献
[edit | edit source]- ↑ T. Haslwanter (2012). "墨西哥帽函数 [Python]". 私人通讯.
- ↑ David, Hubel (1988). 眼、脑和视觉. 亨利·霍尔特公司. 检索自 2014-08-08.
- ↑ Olshausen,B.A. 和 Field,D.J. (1996). "通过学习自然图像的稀疏代码来获得简单细胞感受野特性". 自然. 381 (6 月 13 日): 607–609.
{{cite journal}}
: CS1 维护: 多个名称: 作者列表 (link) - ↑ scikits-image 开发团队 (2012). "从 SimpleIimage 中出现类 Gabor 函数 [Python]".
- ↑ Thomas Haslwanter (2012). "Gabor 滤波器在图像上的演示应用 [Python]".