边缘检测——Roberts算子

Roberts算子

采用对角线方向相邻两象素之差近似梯度幅值检测边缘,是一个 2x2 的模版,模板分为水平方向和垂直方向。

模板:

 计算公式:

最终计算公式: 

原理:

[说明]边缘检测的对象只能是灰度图片

为什么这样的公式可以计算灰度图片的边缘呢?其实该公式利用的是物体边缘处存在的像素差。

例如,有下面一张图片:

图片中只有两个图形,我们用人眼一看就能感知到两个图像的边缘。那么,我们仔细想一下,我们为何能一眼就看出来了呢?其实很简单,因为图像里面的颜色和外面的颜色不一样,所以只需找到两种颜色的交界处就能找到它们对应的边缘了。

因此,我们只需让计算机寻找不同颜色的交界处便能找到物体的边缘。那么,怎么找到两种不同颜色的交界处呢?在回答这个问题之前,我们先看一下图形内部和外部的像素值是多少。

经检测发现,内部的像素值等于0,外部的像素值等于255。

扫描二维码关注公众号,回复: 16843208 查看本文章

那么,如何让计算机知道两种颜色的交界处,最好、直接的方法就是遍历整张图片,边遍历边检测相邻的像素值的差值,一旦相邻的像素之间的像素值的差值较大,说明它们之间的像素值有剧烈的变化,则可以认为此时处于边缘位置。

而本文要介绍的Roberts算法便是基于相邻像素值之差判断当前是否是边缘最简单的算法。

代码实现: 

import numpy as np
import cv2
from matplotlib import pyplot as plt

def robert(img):
  r, c = img.shape
  new_image = np.zeros((r, c))
  new_imageX = np.zeros((r, c))
  new_imageY = np.zeros((r, c))
  dx = [[-1,0],[0,1]]
  dy = [[0,-1],[1,0]]
  for i in range(r):
    for j in range(c):
      if (j+2<=c) and (i+2<=r):
        new_imageX[i,j] = (np.sum(img[i:i+2, j:j+2] * dx))**2
        new_imageY[i,j] = (np.sum(img[i:i+2, j:j+2] * dy))**2
        new_image[i,j] = (new_imageX[i, j]*new_imageX[i,j] + new_imageY[i, j]*new_imageY[i,j])**0.5
  return np.uint8(new_image)

# 图像转化成灰度图像
img = cv2.imread('nms.jpg', cv2.IMREAD_GRAYSCALE)
img = cv2.GaussianBlur(img,(5,5),1.5)
Roberts = robert(img)
plt.subplot(1,2,1)
plt.imshow(img)
plt.subplot(1,2,2)
plt.imshow(Roberts)
plt.show()

 结果:

原图: 

猜你喜欢

转载自blog.csdn.net/qq_55126913/article/details/129712342