在眼底图像处理时,先进行图像的预处理,需要提取血管灰度图像进行分析,但图像可能比较暗,还有噪音。
需要进行灰度图像增强,对噪音区采取图像平滑,消除图像中噪声的干扰,或者降低对比度。
对眼底血管的边缘末梢,需要进行图像锐化,提高对比度。
即当邻域中心像素灰度低于它所在的领域内其它像素的平均灰度时,将此中心像素的灰度应进一步降低,
当邻域中心像素灰度高于它所在的邻域内其它像素的平均灰度时,将此中心像素的灰度应被进一步提高,
以此实现图像的锐化处理。
大家知道,函数的一阶微分描述了函数图像是变化方向,即增长或者降低;
而二阶微分描述的则是图像变化的速度,急剧增长下降还是平缓的增长下降。
图像的一阶偏微分和推出的二元函数微分:
一阶微分法能够用来检测图像边缘是否存在。
那么二阶微分法,也就是拉普拉斯算子就可以确定边缘的位置。(有的文章中称下式为拉普拉斯掩膜中心系数)
据此我们可以推出依据二阶微分能够找到图像的色素的过渡程度,例如白色到黑色的过渡就是比较急剧的。
拉普拉斯锐化图像处理就是这个思想。
根据图像中某个像素的周围像素到此像素的突变程度有关,我们可以进行图像边缘检测。运用拉普拉斯增强图像的细节,找到图像的边缘。但是有时候会把噪音也给增强了,所以在锐化前对图像进行平滑处理。
这样可以找到一个模板矩阵:
这个成为四邻域也就是上面的二阶微分法
这个是八邻域。
从上面的两种模板中就可以看出,如果一个黑色平面中有一个白点,那么模板矩阵可以使这个白点更亮。
由于图像边缘就是灰度发生跳变的区域,所以拉普拉斯模板对边缘检测很有用。
八邻域的表示法为:将算得的值替换原(x,y)处的像素值,可以得到类似边界的地方,然后根据下式得到锐化图像:
大家下面可以从选取各拉普拉斯算子和执行的结果图像中体会。图1是源图
图2中间有亮区,因为kernel1算子是小数。图3 没有这个问题,其kernel2算子是整数,
图6 中部分血管有反常的白点,kernel 5算子中有-1的原因
def laplasFilter(img_src):
kernel1 = np.array(([0.0625, 0.125, 0.0625],
[0.125, 0.25, 0.125],
[0.0625, 0.125, 0.0625]),
dtype="float32"
)
kernel2 = np.array(([1, 2, 1],
[2, 4, 2],
[1, 2, 1]),
dtype="float32"
)
kernel3 = np.array(([1, 2, 1],
[2, 8, 2],
[1, 2, 1]),
dtype="float32"
)
kernel4 = np.array(([0, 1, 0],
[1, 8, 1],
[0, 1, 0]),
dtype="float32"
)
kernel5 = np.array(([-1, 1, -1],
[-1, 8, -1],
[-1, 1, -1]),
dtype="float32"
)
img_dst1 = cv2.filter2D(img_src, -1, kernel1)
image_Enhance1 = img_src + img_dst1
cv2.imshow("laplas1", image_Enhance1)
img_dst2 = cv2.filter2D(img_src, -1, kernel2)
image_Enhance2 = img_src + img_dst2
cv2.imshow("laplas2", image_Enhance2)
img_dst3 = cv2.filter2D(img_src, -1, kernel3)
image_Enhance3 = img_src + img_dst3
cv2.imshow("laplas3", image_Enhance3)
img_dst4 = cv2.filter2D(img_src, -1, kernel4)
image_Enhance4 = img_src + img_dst4
cv2.imshow("laplas4", image_Enhance4)
img_dst5 = cv2.filter2D(img_src, -1, kernel5)
image_Enhance5 = img_src + img_dst5
cv2.imshow("laplas5", image_Enhance5)
源图像