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()