Python-图像边缘检测之sobel、prewitt、roberts、canny算子

scikit-image是基于scipy的一款图像处理包,它将图片作为numpy数组进行处理,是非常好的数字图像处理工具。

首先需要安装scikit-image库:

pip install scikit-image
sobel算子
from skimage import io,filters,img_as_ubyte
import matplotlib.pyplot as plt

# 图像读取
img = io.imread('./2290.jpg', as_gray=True)
io.imshow(img)
io.show()

# sobel边缘检测
edges = filters.sobel(img)
# 浮点型转成uint8型
edges = img_as_ubyte(edges)
# 显示图像
plt.imshow(edges, plt.cm.gray)
plt.show()
# 保存图像
io.imsave('./2290_sobel.jpg', edges)

# sobel 水平方向边缘检测
edgesh = filters.sobel_h(img)
edgesh = img_as_ubyte(edgesh)
plt.imshow(edgesh, plt.cm.gray)
plt.show()
io.imsave('./2290_sobel_h.jpg', edges)

# sobel 竖直方向边缘检测
edgesv = filters.sobel_v(img)
edgesv = img_as_ubyte(edgesv)
plt.imshow(edgesv, plt.cm.gray)
plt.show()
io.imsave('./2290_sobel_v.jpg', edges)
prewitt算子

调用格式同sobel:

edges = filters.prewitt(img)
edges = filters.prewitt_h(img)  # 水平方向边缘检测
edges = filters.prewitt_v(img)  # 垂直方向边缘检测
roberts算子

调用格式同sobel:

edges = filters.roberts(img)
canny算子

canny算子不是放在filters模块,而是放在feature模块

from skimage import feature
edges = feature.canny(image,sigma=1.0)  # sigma越小,边缘线条越细小

现对某一文件夹下的所有图片进行边缘检测并保存图片:

import os
from skimage import io,filters,img_as_ubyte

# sobel边缘检测
def Sobel(path, name):
    img = io.imread(path, as_gray=True)
    edges = filters.sobel(img)
    edges = img_as_ubyte(edges)  # 浮点型转成uint8型
    io.imsave('/home/jiao/zuan_sobel/' + name + '.jpg', edges)

if __name__ == '__main__':
    img_path = '/home/jiao/zuan'
    for img in os.listdir(img_path):
        img_name = os.path.splitext(img)
        img_destfile = img_path + '/' + img_name[0] + img_name[1]
        out = Sobel(img_destfile, img_name[0])
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Sobel算子Canny算子、Prewitt边缘检测算子Roberts边缘检测算子都是常用的图像边缘检测算法,它们各有优缺点,下面对它们进行比较: 1. Sobel算子 Sobel算子是一种基于梯度的边缘检测算法,它可以在图像中检测到水平和垂直方向上的边缘。相对于其他算法,Sobel算子计算速度快,易于实现,同时在边缘检测中也有较好的效果。但是,Sobel算子只能检测到水平和垂直方向上的边缘,对于斜向边缘的检测效果不太好。 2. Canny算子 Canny算子是一种常用的边缘检测算法,它利用高斯滤波器平滑图像,然后计算梯度,最后使用非极大值抑制和双阈值处理来检测边缘。Canny算子可以检测到所有方向上的边缘,同时它通过双阈值处理可以控制检测到的边缘数量。但是,Canny算子的计算量比较大,运行速度比较慢。 3. Prewitt边缘检测算子 Prewitt算子也是一种基于梯度的边缘检测算法,它与Sobel算子类似,可以检测到水平和垂直方向上的边缘。相对于Sobel算子,Prewitt算子的计算量较小,但是在边缘检测中的效果不如Sobel算子。 4. Roberts边缘检测算子 Roberts算子是一种基于微分的边缘检测算法,它使用两个 $2\times 2$ 的卷积核来计算图像中每个像素点的梯度值,从而得到边缘信息。相对于其他算法,Roberts算子计算速度快,但其缺点是对噪声比较敏感,且检测到的边缘比较粗糙。 综上所述,不同的边缘检测算法有各自的优缺点,需要根据实际应用场景进行选择。在一些需要快速处理的场景中,可以选择Sobel算子Roberts算子;在需要精确检测、对噪声抗干扰的场景中,可以选择Canny算子;在计算资源有限的场景中,可以选择Prewitt算子
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值