边缘检测算子汇总(计算机视觉前瞻)
边缘检测其实比较简单,就是对于一张图像上的所有像素点都乘以一个算子的3*3矩阵模板,这个模板对于不同的算子就有不同的表现形式。下面我们使用python脚本来对这些算子进行汇总。
- 一阶算子
对于一阶算子,需要分别在X方向和Y方向进行算子矩阵的乘法;其通用的代码函数可以写为:
def One_order_edge(img,kernelx,kernely,flag=False,threshold=20,r=0):
'''
一阶算子的分割
:param img: 原始图片
:param kernelx,kernely: 一阶算子模板
:param 二值化处理变量
:param:二值化处理的阈值
:param:二值化处理后的颜色R
:return:
'''
# 使用opencv的卷积运算
x = cv2.filter2D(img, cv2.CV_16S, kernelx)
y = cv2.filter2D(img, cv2.CV_16S, kernely)
# 限定再uint8内
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
#城区距离计算
res = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
h, w, c = res.shape
if flag:
for i in range(h):
for j in range(w):
value = int(int(res[i][j][0]) + int(res[i][j][1]) + int(res[i][j][2]))
value = value / 3
if value > threshold:
res[i][j] = [0, 0, r]
else:
res[i][j] = [255, 255, 255]
res = cv2.convertScaleAbs(res)
return res
上面中的二值化处理可以不进行操作,这样最终处理后的图片可能会比较杂乱。
- 二阶算子
二阶算子的计算则不需要分别在X和Y轴上进行操作,它只需要一个函数模板即可,所以这里可以使用一个函数来表达二阶算子的边缘检测算法。
def edge_Laplacian(img,flag=False,threshold=65,r=0):
'''
二阶算子Laplacian
:param img: 原始图片
:param 二值化处理变量
:return:
'''
H = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype=int)
res = cv2.filter2D(img, cv2.CV_16S, H)
res = cv2.convertScaleAbs(res)
h, w, c = res.shape
if flag:
for i in range(h):
for j in range(w):
value = int(int(res[i][j][0]) + int(res[i][j][1]) + int(res[i][j][2]))
value = value / 3
if value > threshold:
res[i][j] = [0, 0, r]
else:
res[i][j] = [255, 255, 255]
res = cv2.convertScaleAbs(res)
return res