Roberts算子
Roberts 算子是利用局部差分寻找边缘的一种算子,是最简单的边缘检测算子。Roberts 算子利用对角线方向相邻两像素之差近似梯度幅值来检测边缘,检测垂直边缘的效果要优于其他方向边缘,定位精度高,但对噪声的抑制能力较弱。边缘检测算子检查每个像素的邻域并对灰度变化率进行量化,同时也包含方向的确定。
Roberts 算子边缘定位准,但是对噪声敏感。常用来处理具有陡峭的低噪声图像,当图像边缘接近于正45度或负45度时,该算法处理效果更理想。它适用于边缘明显而且噪声较少的图像分割,在应用中经常用 Roberts 算子来提取道路。其缺点是对边缘的定位不太准确,提取的边缘线条较粗。
在 Python 中,Roberts 算子主要通过 Numpy 定义卷积模板,再调用 OpenCV 的 filter2D() 函数实现边缘提取。该函数主要是利用内核实现对图像的卷积运算,其函数原型如下所示:
dst = filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
其中:
src:表示输入图像;
ddepth:表示目标图像所需的深度;
kernel:表示卷积核,一个单通道浮点型矩阵;
dst:表示输出的边缘图,其大小和通道数与输入图像相同;
anchor:表示内核的基准点,其默认值为(-1,-1),位于中心位置;
delta:表示在储存目标图像前可选的添加到像素的值,默认值为0;
borderType:表示边框模式。
程序示例:
# -*- coding: utf-8 -*-
import cv2
import numpy as np
def robs():
filepath = '/data/workspace/myshixun/task2/'
# 读取图像
img = cv2.imread(filepath+'road.png')
########## Begin ##########
# 1. 灰度化处理图像
grayimg = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 2. Roberts算子
kernelx = np.array([[-1,0],[0,1]],dtype=int)
kernely = np.array([[0,-1],[1,0]],dtype=int)
# 3. 卷积操作
x = cv2.filter2D(grayimg, cv2.CV_16S, kernelx)
y = cv2.filter2D(grayimg, cv2.CV_16S, kernely)
# 4. 数据格式转换
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Roberts = cv2.addWeighted(absX,0.5,absY,0.5,0)
########## End ##########
# 保存图像
cv2.imwrite(filepath+"out/roberts.png",Roberts)