OpenCV——Roberts算子

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)

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值