参考链接:https://www.cnblogs.com/wj-1314/p/9800272.html
一、LoG算子
参考:
https://blog.youkuaiyun.com/pi9nc/article/details/8655396
http://www.roborealm.com/help/LOG.php
1.Laplacian算子
定义:图像I在x、y方向上的二阶导数的和
三个经典模板:
模板实际上是根据离散数据求近似二阶导数的公式,整理得到的矩阵形式。
2.LoG算子
由于Laplacian算子对噪点敏感,常常在Laplacian处理前对图片进行高斯滤波,为了简化运算,将高斯滤波算子与Laplacian算子相结合,就得到了LoG算子:
而当高斯滤波范围很窄(方差很小)时,高斯滤波不再产生影响,LoG算子退化为Laplacian算子。
3.编程实现
参考网站的代码有一个严重的错误
第27行的image应改为new_image,以将new_image的灰度值缩放到0~255范围内。
下面是更正后的代码
# LoG边缘检测算子
def LaplaceOperator(roi, operator_type="fourfields"):
if operator_type == "fourfields":
laplace_operator = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])
elif operator_type == "eightfields":
laplace_operator = np.array([[1, 1, 1], [1, -8, 1], [1, 1, 1]])
else:
raise ("type Error")
result = np.abs(np.sum(roi * laplace_operator))
return result
def LaplaceAlogrithm(image, operator_type="fourfields"):
# 提取结果
new_image = np.zeros(image.shape)
# 扩充边界
image = cv2.copyMakeBorder(image, 1, 1, 1, 1, cv2.BORDER_DEFAULT)
for i in range(1, image.shape[0] - 1):
for j in range(1, image.shape[1] - 1):
new_image[i - 1, j - 1] = LaplaceOperator2(image[i - 1:i + 2, j - 1:j + 2], operator_type)
# 归一
new_image = new_image * (255 / np.max(new_image)