感觉系统/计算机模型/视觉信息处理的描述性模拟
本节将概述早期视觉系统各级处理的模拟。利用MATLAB及其工具箱来实现视觉系统功能的再现。之前已讨论过早期视觉系统完成的处理,可将其与以下示意图中所述的一些功能联系起来。在(Cormack 2000)中可以找到对图像处理的良好描述。
如上图概述所示,必须考虑图像处理的不同阶段,才能模拟视觉系统对刺激的响应。因此,下一节将简要讨论图像处理。但首先,我们将重点讨论感觉器官组件的模拟。
平均眼睛的角膜前曲率半径为 = 7.8 毫米,房水的折射率为 1.336。眼睛的长度为 = 24.2 毫米。虹膜近似扁平,虹膜边缘(也称为角膜缘)的半径为 = 5.86 毫米。
眼球的光学特性由其二维空间冲激响应函数(点扩展函数(PSF))决定。
其中 是图像中心弧分的径向距离。
显然,对给定数字图像的影响取决于该图像与您眼睛的距离。作为一个简单的占位符,用高 30 且标准差为 1.5 的高斯滤波器替换此滤波器。
在一维中,高斯函数由以下公式描述:
忽略以下因素:
- 时间响应
- 波长效应(特别是对于锥体细胞)
- 虹膜的张开
- 光感受器的采样和分布
- 光敏色素的漂白
我们可以用**高斯差**(DOG,维基百科 [1])近似神经节细胞的响应。
Python 实现的源代码可在 [1] 中找到。
的值 和 的比例约为 1:1.6,但随偏心率而变化。对于小细胞(或 P 细胞),感受野大小(RFS)约为
而对于 M 细胞,约为
其中 RFS 以弧分表示,偏心率以从中央凹中心到视网膜的距离(毫米)表示(Cormack 2000)。
同样忽略时间特性,初级视觉皮层 (V1) 中简单细胞的活动可以用 Gabor 滤波器(维基百科 [2])建模。Gabor 滤波器是一种线性滤波器,其冲激响应由谐波函数(正弦函数)乘以高斯函数定义。高斯函数使谐波函数的幅度远离原点而减小,但在原点附近,谐波函数的性质占主导地位。
其中
以及
在这个方程中, 代表余弦因子的波长, 代表 Gabor 函数(维基百科 [3])平行条纹的垂直方向, 是相位偏移, 是高斯包络的 sigma,而 是空间纵横比,并指定了 Gabor 函数支持的椭圆率。
简单细胞感受野的大小取决于其相对于中央凹的位置,但不像视网膜神经节细胞那样严格。最小的视野,位于中央凹及其附近,约为四分之一度乘四分之一度,中心区域只有几分钟的弧度(与视网膜神经节细胞中最小的感受野中心的直径相同)。在视网膜周边,简单细胞感受野可以达到 1 度乘 1 度。[2].
Gabor 类函数自然而然地出现,仅仅来自日常场景的统计数据[3]。一个例子是,即使是简单图像的统计数据也能导致 Gabor 类感受野的出现,用 Python 写的例子在 [4] 中给出;用 Gabor 函数过滤图像的效果的(Python)演示可以在 [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 种不同的灰度颜色的问题。
表示彩色图像比表示灰度图像只稍微复杂一些。你只需要知道,计算机使用三种主色红色、绿色和蓝色的加色混合来工作。这些就是所谓的 RGB 颜色。
这些图像也是通过像素保存的。但现在每个像素必须知道 3 个介于 0 和 256 之间的值,对应每种颜色 1 个值。因此现在我们可以表示 2563= 16,777,216 种不同的颜色。类似于灰度图像,这里也同样适用,没有颜色意味着黑色,所有颜色都存在意味着白色。也就是说,颜色 (0,0,0) 是黑色,而 (0,0,255) 意味着蓝色,(255,255,255) 是白色。
警告 - 描述二维空间中点的位置有两种常见的不同方法:1) x/y 表示法,其中 x 通常指向左侧;2) 行/列方向。仔细注意描述你的数据时使用的是哪种坐标,因为这两种描述方式不一致!
在许多技术应用中,我们发现了一些基本的基底,我们可以用它轻松地描述特征。在 1 维情况下,滤波器并不是什么大问题,因此我们可以使用这些滤波器来改变图像。所谓的“Savitzky- Golay 滤波器”可以平滑输入信号。该滤波器由 Abraham Savitzky 和 Marcel J. E. Golay 在 1964 年描述。它是一个脉冲响应滤波器(IR)。
为了更好地理解,让我们看一个例子。在 1 维情况下,我们通常处理向量。我们称其中一个给定的向量为 x,它具有以下形式:。我们的目的是平滑这个向量 x。为此,我们只需要另一个向量 ,我们称这个向量为权重向量。
有了 ,我们现在就得到了一个平滑后的向量 y。这个向量比之前的向量更平滑,因为我们只保存了向量中几个元素的平均值。这意味着新找到的向量元素取决于要平滑的元素左右两边的几个元素。这种方法的一个主要缺点是,新找到的向量 y 只有 n-m 个元素,而不是原始向量 x 的 n 个元素。
绘制这个新向量将导致与之前相同的函数,只是振幅更小。因此没有数据丢失,但我们有更少的波动。
从 1 维情况到 2 维情况的转换是通过简单地将向量转换为矩阵来实现的。如前所述,对于计算机或 MATLAB 等软件工具而言,灰度图像无非就是一个充满自然数(通常介于 0 到 255 之间)的巨大矩阵。
权重向量现在是权重矩阵。但我们仍然通过将不同的矩阵元素乘积加起来来使用滤波器。
对于前面提到的线性滤波器,它们是可交换的。引用维基百科的描述:如果满足以下条件,则称 x 在 ∗ 下面与 y 可交换:
换句话说,使用多少个不同的线性滤波器以及以何种顺序使用并不重要。例如,如果将 Savitzky-Golay 滤波器应用于一些数据,然后使用第二个 Savitzky-Golay 滤波器来计算一阶导数,那么结果与反转滤波器顺序是一样的。它甚至适用,即存在一个滤波器可以实现与应用两个滤波器相同的效果。
相比之下,图像上的形态学操作是非线性操作,最终结果取决于执行顺序。如果我们考虑任何图像,它都是由具有 xij 值的像素定义的。此外,该图像被认为是黑白图像,因此我们有
为了定义形态学操作,我们必须设置一个结构元素 SE。例如,一个 3x3 的矩阵作为图像的一部分。
腐蚀 E 的定义如下
也就是说,如果结构元素 M 中的 **任何** 像素值为 0,则腐蚀操作将 M 中特定像素的值设为零。否则 E(M) = 1。
对于 **膨胀** 操作 D,如果 SE 中的 **任何** 值为 1,则 M 的膨胀结果 D(M) 被设为 1。
- .
膨胀和腐蚀的组合:图像的开运算和闭运算
[edit | edit source]膨胀和腐蚀有两种组合。一种称为 **开运算**,另一种称为 **闭运算**。它们分别表示:
参考文献
[edit | edit source]- ↑ T. Haslwanter (2012). "Mexican Hat Function [Python]". private communications.
- ↑ David, Hubel (1988). Eye, Brain, and Vision. Henry Holt and Company. Retrieved 2014-08-08.
- ↑ Olshausen,B.A. and Field,D.J. (1996). "Emergence of simple-cell receptive field properties by learning a sparse code for natural images". Nature. 381 (June 13): 607–609.
{{cite journal}}
: CS1 maint: multiple names: authors list (link) - ↑ scikits-image 开发团队 (2012). "从 SimpleIimage 中出现的 Gabor 类函数 [Python]".
- ↑ Thomas Haslwanter (2012). "Gabor 滤波器在图像中的演示应用 [Python]".