欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Roberts算子详细代码(Python2.7)

程序员文章站 2022-06-01 18:14:30
...

Roberts算子详细代码(Python2.7)

在边缘检测中,传统的Roberts算子是一种简单而高效的算子,它采用2*2模板,利用图像中对角线方向相邻像素差值近似梯度幅度来检测目标边缘。

Gx模板:

1 0
0 -1

Gy模板 :

0 1
-1 0

x,y像素坐标

x,y x,y+1
x+1,y x+1,y+1

Gx=1*f(x,y)+0*f(x,y+1)+0*f(x+1,y)+(-1)*f(x+1,y+1)=f(x,y)-f(x+1,y+1)

Gy=0*f(x,y)+1*f(x,y+1)+(-1)*f(x+1,y)+0*f(x+1,y+1)=f(x,y+1)-f(x+1,y)

G(x,y)=|Gx|+|Gy|=|f(x,y)-f(x+1,y+1)|+|f(x, y+1)-f(x+1,y)|

代码块

Roberts算子详细代码,与数学公式完全对照例如:

import Image
import numpy as np
import matplotlib.pyplot as pyplot
import pylab
im =Image.open('Bikesgray.jpg')#记得要用灰度图,如果是彩色图需要转换成灰度图
w,h = im.size
res = np.zeros((w, h))#取一个和原图一样大小的图片,并在里面填充0
roberts_x =[[1, 0],[0, -1]]#Roberts模板
roberts_y =[[0, 1],[-1, 0]]
for x in range(w-1):
    for y in range(h-1):
        sub =[[im.getpixel((x, y)), im.getpixel((x, y+1))],[im.getpixel((x+1, y)), im.getpixel((x+1, y+1))]]#x,y代表像素的位置,而不是像素值,要从图片上得到像素值
        sub = np.array(sub)#在python标准中list是不能做乘法,所以np.array()把list转就可以相乘
        roberts_x = np.array(roberts_x)
        roberts_y = np.array(roberts_y)
        var_x =sum(sum(sub * roberts_x))#矩阵相乘,查看公式,我们要得到是一个值,所以对它进行两次相加
        var_y = sum(sum(sub * roberts_y))

        var = abs(var_x) + abs(var_y)

        res[x][y] = var#把var值放在x行y列位置上

pyplot.imshow(res, cmap=pyplot.cm.gray)#输出图片可能颜色有问题,用cmap=pyplot.cm.gray进行改颜色还有方向问题,也可以通过调整
pylab.show()

Roberts算子详细代码(Python2.7)
Roberts算子详细代码(Python2.7)

相关标签: Roberts算子