引言
有限差分方法(FDM)是计算机数值模拟最早采用的方法,至今仍在广泛应用。该方法将求解域划分为差分网格,用有限个网格节点代替连续的求解域。在直角坐标系下,求解域差分网格通常为均匀的矩形,在表达非矩形物体边界时通常需要采用坐标映射或者网格点逼近,而网格点逼近较为简单快捷。
我们对有解析式的几何边界,构造有形状信息的布尔矩阵,可以实现边界形状的识别Python数值优化:使用Euler法求解二维热传导方程2。对于一般的图形通常没有解析边界,使有限差分方法适用于一般(平面)几何的关键是要有一个“形状”矩阵,其值表示域的外部,内部和边界。而图像就是用矩阵存储的,包含许多成熟的特征识别算法,因此考虑采用图像的方法来处理,主要利用的就是边缘检测算法。
Canny边缘检测算法由计算机科学家 John F. Canny 于 1986 年提出,主要可以分为以下几个步骤图像灰度化(降维处理)
高斯滤波(平滑和降噪)
计算图像梯度值和方向
应用非极大值抑制NMS
双阈值检测确定边界
灰度化
灰度化实际上是一种降维的操作,将三个通道的像素值转换为单通道数据,减少计算量(如不进行灰度化,也可以直接进行后面步骤),后面针对单通道进行计算。
def img_grey(img):
"""Grey(i,j) = 0.3 * R(i,j) + 0.59 * G(i,j) + 0.11 * B(i,j)"""
img_grey = np.dot(img[...,:3], [30, 59, 11])/100
return img_grey
高斯滤波
高斯滤波主要使图像变得平滑,减少噪声,但同时也有可能增大了边缘的宽度。其作用原理和均值滤波器类似,都是取滤波器窗口内的像素的均值作为输出,而其系数按照高斯函数离散化,具体如下:
滤波核大小为(2k+1, 2k+1), 这里
和
从0开始计数,与Python编程时保持下标一致,而MATLAB从1开始计数
def gaussian_kernel(sigma,size):
"""Create a (2r+1)x(2r+1) gaussian_kernelH[i, j] = (1/(2*pi*sigma**2))*exp(-1/2*sigma**2((i-r-1)**2 + (j-r-1)**2))Parameters===========sigma: Standard deviationsize: Kernel width size"""
r = int(size/2)
kernel = np.zeros((size,size))
k_sum = 0
for i in range(size):
for j in range(size):
kernel[i, j] = np.exp((-1/(2*sigma**2)*(np.square(i-r) + np.square(j-r))))/(2*np.pi*sigma**2)
k_sum = k_sum + kernel[i, j]
# Normalized the kernel
kernel = kernel / k_sum
return kernel
构造一个3x3的kernel窗口g_kernel = gaussian_kernel(1,3)
[[0.07511361 0.1238414 0.07511361]
[0.1238414 0.20417996 0.1238414 ]
[0.07511361 0.1238414 0.07511361]]
接下来用离散卷积的方法进行平滑滤波,即对原图扫描计算像素平均值卷积扫描过程 https://mlnotebook.github.io/post/CNN1/