📜  Python OpenCV – 罗伯茨边缘检测

📅  最后修改于: 2022-05-13 01:55:12.540000             🧑  作者: Mango

Python OpenCV – 罗伯茨边缘检测

边缘检测是指一组数学技术,用于识别数字图像中图像亮度突然变化的点,或者更正式地说,存在不连续性的点。图像亮度的急剧波动通常被归为一组称为边缘的曲线段。

罗伯茨边缘检测

罗伯茨运算符以直接、快速计算的方式测量图像上的二维空间梯度。结果,经常对应于边缘的强空间梯度区域被突出显示。操作员的输入和输出都是最典型配置的灰度图像。输入图像在该位置的空间梯度的估计绝对幅度由输出中每个位置的像素值表示。

罗伯茨交叉运算符

罗伯茨交叉运算符用于图像处理和计算机视觉中的边缘检测。 Lawrence Roberts 在 1963 年提出了它,它是最早的边缘检测器之一。罗伯茨交叉运算符是一种微分运算符,它通过离散微分逼近图像的梯度,这是通过计算对角相邻像素之间差异的平方和来完成的。

方法:

运算符由一对 2×2 卷积掩码组成,如图所示。一个面具只是另一个转了 90 度。这很像 Sobel运算符。

01
-10
10
0-1

这些掩码用于两个垂直方向中的每一个,旨在最大程度地响应与像素网格呈 45° 角的边缘。掩码可以独立地应用于输入图像,以在每个方向上产生单独的梯度分量测量(调用这些G_x  G_y  )。然后可以将这些组合起来以确定每个站点的梯度的绝对幅度和方向。梯度幅度由下式给出

G = \sqrt{G_x^2+G_y^2}

产生空间梯度的边缘方向角(相对于像素网格方向)由下式给出:

\theta = \arctan(\frac{G_x}{G_y})-\frac{3\pi}{4}

在这种情况下,方向 0 表示从黑色到白色的最大对比度方向在图像上从左到右运行,而其他角度从这里逆时针测量。

脚步:

  • 导入所有需要的库。
  • 读取图像并将其转换为灰度。

句法:

  • 初始化一对罗伯茨交叉运算符:

句法:

  • 计算G_x  G_y

句法:

  • 计算 G(梯度幅度)。

句法:

输入图像:

下面是实现:

Python3
import cv2 
import numpy as np
from scipy import ndimage
  
roberts_cross_v = np.array( [[1, 0 ],
                             [0,-1 ]] )
  
roberts_cross_h = np.array( [[ 0, 1 ],
                             [ -1, 0 ]] )
  
img = cv2.imread("input.webp",0).astype('float64')
img/=255.0
vertical = ndimage.convolve( img, roberts_cross_v )
horizontal = ndimage.convolve( img, roberts_cross_h )
  
edged_img = np.sqrt( np.square(horizontal) + np.square(vertical))
edged_img*=255
cv2.imwrite("output.jpg",edged_img)


输出图像:

好处:

  • 边缘和方向的检测很容易。
  • 保留对角线方向点。

缺点:

  • 对噪音非常敏感。
  • 边缘检测不是很准确。

应用:

  • 图像处理
  • 计算机视觉——特征提取和特征检测