iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python利用OpenCV和skimage实现图像边缘检测
  • 745
分享到

Python利用OpenCV和skimage实现图像边缘检测

Python 官方文档:入门教程 => 点击学习

摘要

目录一、简介二、OpenCV 实践三、skimage 实践一、简介 提取图片的边缘信息是底层数字图像处理的基本任务之一。边缘信息对进一步提取高层语义信息有很大的影响。大部分边缘检测算

一、简介

提取图片的边缘信息是底层数字图像处理的基本任务之一。边缘信息对进一步提取高层语义信息有很大的影响。大部分边缘检测算法都是上个世纪的了,OpenCV 的使用的算法是 Canny 边缘检测算法,大概是在 1986 年由 John F. Canny 提出了,似乎说明边缘检测算法的研究已经到达了瓶颈期。跟人眼系统相比,边缘检测算法仍然逊色不少。

Canny 边缘检测算法是比较出色的算法,也是一种多步算法,可用于检测任何输入图像的边缘。利用它检测图像边缘时主要有以下步骤:

  • 应用高斯滤波来平滑图像,目的是去除噪声。
  • 计算高斯滤波器的导数,计算图像像素的梯度,得到沿x和y维度的梯度。
  • 应用非最大抑制(non-maximum suppression)技术来消除边缘误检(本来不是但检测出来是)
  • 应用双阈值的方法来决定可能的(潜在的)边界
  • 利用滞后阈值方法保留高于梯度幅值的像素,忽略低于低阈值的像素,实现边缘追踪。

Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:

  • 最优检测:算法能够尽可能多地标识出图像中的实际边缘,漏检真实边缘的概率和误检非边缘的概率都尽可能小;
  • 最优定位准则:检测到的边缘点的位置距离实际边缘点的位置最近,或者是由于噪声影响引起检测出的边缘偏离物体的真实边缘的程度最小;
  • 检测点与边缘点一一对应:算子检测的边缘点与实际边缘点应该是一一对应。

为了满足这些要求 Canny 使用了变分法(calculus of variations),这是一种寻找优化特定功能的函数的方法。最优检测使用四个指数函数项表示,它可以由高斯函数的一阶导数来近似。

二、opencv 实践

cv2.Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None):
# 用自定义梯度
cv2.Canny(dx, dy, threshold1, threshold2[, edges[, L2gradient]]) -> edges
  • image:参表示8位输入图像
  • threshold1:设置的低阈值
  • threshold2:设置的高阈值
  • edges:输出边缘图像,单通道8位图像
  • apertureSize:Sobel算子的大小
  • L2gradient:一个布尔值,如果为真,则使用更精确的 L2 范数进行计算(即两个方向的倒数的平方和再开方),否则使用 L1 范数(直接将两个方向导数的绝对值相加)。
def opencv_canny(image):
    # 高斯模糊  降低噪声
    blurred = cv.GaussianBlur(image, (5, 5), 0)
    # 转为灰度图像
    gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)
    # 计算x y 方向梯度
    grad_x = cv.Sobel(gray, cv.CV_16SC1, 1, 0)
    grad_y = cv.Sobel(gray, cv.CV_16SC1, 0, 1)
    edge_output = cv.Canny(grad_x, grad_y,  60, 120)
    # 英文字体   Times New Roman
    plt.rcParams['font.sans-serif'] = ['Times New Roman']

    # 可视化结果
    plt.figure(figsize=(8, 4), dpi=500)
    plt.subplot(121)
    plt.imshow(gray, cmap='gray')
    plt.title('Original Image', fontsize=18)
    plt.xticks([]), plt.yticks([])
    plt.subplot(122)
    plt.imshow(edge_output, cmap='gray')
    plt.title('Edge Image', fontsize=18)
    plt.xticks([]), plt.yticks([])
    plt.savefig("002.png", dpi=500)
    plt.show()


if __name__ == "__main__":
    # 读取图像  传入
    src = cv.imread("Lenna.png")
    opencv_canny(src)

结果如下:

三、skimage 实践

import numpy as np
from skimage.io import imread
from skimage.feature import canny
import matplotlib.pyplot as plt

# 读取图像
img = imread("Lenna.png", as_gray=True)
# 高斯模糊  降低噪声
img = cv.GaussianBlur(img, (5, 5), 0)

# Canny边缘检测
edges = canny(img, sigma=1.6)

# 可视化结果
plt.rcParams['font.sans-serif'] = ['Times New Roman']
plt.figure(figsize=(8, 4), dpi=500)
plt.subplot(121)
plt.imshow(img, cmap='gray')
plt.title('Original Image', fontsize=18)
plt.xticks([]), plt.yticks([])
plt.subplot(122)
plt.imshow(edges, cmap='gray')
plt.title('Edge Image', fontsize=18)
plt.xticks([]), plt.yticks([])

plt.show()

结果如下:

import numpy as np
import matplotlib.pyplot as plt
from scipy import ndimage as ndi
from skimage import feature


# 产生带有噪声的举行图案
im = np.zeros((128, 128))
im[32:-32, 32:-32] = 1
im = ndi.rotate(im, 15, mode='constant')  # 旋转一定角度
im = ndi.gaussian_filter(im, 4)
im += 0.2 * np.random.random(im.shape)

# Compute the Canny filter for two values of sigma
edges1 = feature.canny(im, sigma=1)
edges2 = feature.canny(im, sigma=3)

# display results
fig, (ax1, ax2, ax3) = plt.subplots(nrows=1, ncols=3, figsize=(8, 4),
                                    sharex=True, sharey=True, dpi=500)

ax1.imshow(im, cmap=plt.cm.gray)
ax1.axis('off')
ax1.set_title('Noisy image', fontsize=20)

ax2.imshow(edges1, cmap=plt.cm.gray)
ax2.axis('off')
ax2.set_title(r'Canny filter, $\sigma=1$', fontsize=20)

ax3.imshow(edges2, cmap=plt.cm.gray)
ax3.axis('off')
ax3.set_title(r'Canny filter, $\sigma=3$', fontsize=20)

fig.tight_layout()

plt.show()

结果如下:

skimage 库中函数

skimage.feature.canny(image, sigma=1.0,
                      low_threshold=None, high_threshold=None,
                      mask=None, use_quantiles=False)
  • sigma:高斯滤波器的标准差
  • low_threshold:Canny算法最后一步中,小于该阈值的像素直接置为0
  • high_threshold:Canny算法最后一步中,大于该阈值的像素直接置为255

以上就是python利用OpenCV和skimage实现图像边缘检测的详细内容,更多关于Python图像边缘检测的资料请关注编程网其它相关文章!

--结束END--

本文标题: Python利用OpenCV和skimage实现图像边缘检测

本文链接: https://www.lsjlt.com/news/176032.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python利用OpenCV和skimage实现图像边缘检测
    目录一、简介二、opencv 实践三、skimage 实践一、简介 提取图片的边缘信息是底层数字图像处理的基本任务之一。边缘信息对进一步提取高层语义信息有很大的影响。大部分边缘检测算...
    99+
    2022-12-28
    Python OpenCV 图像边缘检测 Python skimage图像边缘检测 Python图像边缘检测
  • python实现图像边缘检测
    本文实例为大家分享了python实现图像边缘检测的具体代码,供大家参考,具体内容如下 任务描述 背景 边缘检测是数字图像处理领域的一个常用技术,被广泛应用于图像特征提取、目标识别、计...
    99+
    2024-04-02
  • 怎么利用Python+OpenCV实现简易图像边缘轮廓检测
    本篇内容主要讲解“怎么利用Python+OpenCV实现简易图像边缘轮廓检测”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么利用Python+OpenCV实现简易图像边缘轮廓检测”吧!函数基础...
    99+
    2023-06-30
  • Python+OpenCV图像边缘检测四种实现方法
    目录1.Sobel算子2.Schaar算子(更能体现细节)3.Laplacian算子(基于零穿越的,二阶导数的0值点)4.Canny边缘检测(被认为是最优的边缘检测算法)总结 im...
    99+
    2024-04-02
  • Matlab实现图像边缘检测
    为了在一幅图像 f 的(x,y)位置寻找边缘的强度和方向,所选择的工具就是梯度,梯度使用向量来表示: 该向量指出了图像 f 在位置(x,y)处的最大变化率的方向,梯度向量的大小表示...
    99+
    2024-04-02
  • 如何利用Python+OpenCV实现简易图像边缘轮廓检测(零基础)
    目录前言函数基础与三方库cv.threshold(pic,thresh,maxvalue,model)cv.findContours(待处理图片,model(提取模式),method...
    99+
    2024-04-02
  • Python实现Opencv cv2.Canny()边缘检测
    目录1. 效果图2. 源码补充:OpenCV-Python 中 Canny() 参数这篇博客将介绍Canny边缘检测的概念,并利用cv2.Canny()实现边缘检测; Ca...
    99+
    2024-04-02
  • C++ opencv图像处理实现图片边缘检测示例
    目录边缘检测简介一、边缘检测步骤二、Canny1.函数2.代码二、Sobel1.函数2.代码三、Scharr1.函数2.代码四、Laplacian1.函数2.代码总结边缘检测简介 边...
    99+
    2024-04-02
  • Python+OpenCV实现边缘检测与角点检测详解
    目录一、边缘检测1.1、读取图像1.2、图像转换成灰度图像1.3、Sobel算子1.4、Canny算子1.5、显示正常中文的标签1.6、边缘检测结果二、角点检测2.1、读取图像2.2...
    99+
    2023-02-03
    Python OpenCV边缘检测 Python OpenCV角点检测 Python OpenCV 检测
  • Python中图像边缘检测算法如何实现
    这篇“Python中图像边缘检测算法如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中图像边缘检测算法如何...
    99+
    2023-06-30
  • OpenCV中Canny边缘检测的实现
    目录1. Canny 边缘检测理论1.1、高斯滤波1.2、Sobel算子计算梯度和方向1.3、非极大值抑制(定位准确的边缘同时可缩小边缘线宽)1.4、双阈值检测2. OpenCV 之...
    99+
    2024-04-02
  • 详解Python中图像边缘检测算法的实现
    目录写在前面1.一阶微分算子1.1 Prewitt算子1.2 Sobel算子2.二阶微分算子2.1 Laplace算子2.2 LoG算子3.Canny边缘检测写在前面 从本节开始,计...
    99+
    2024-04-02
  • Python OpenCV Canny边缘检测算法如何实现
    本文小编为大家详细介绍“Python OpenCV Canny边缘检测算法如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python OpenCV Canny边缘检测算法如何实现”文章能帮助...
    99+
    2023-07-02
  • 使用OpenCV怎么实现Canny边缘检测
    今天就跟大家聊聊有关使用OpenCV怎么实现Canny边缘检测,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. Canny 边缘检测理论Canny 是一种常用的边缘检测算法. 其是...
    99+
    2023-06-20
  • OpenCV实现Sobel边缘检测的示例
    目录一、Sobel算法1、算法概述2、主要函数二、C++代码三、python代码四、结果展示五、相关链接一、Sobel算法 1、算法概述 Sobel边缘检测算法比较简单,实际应用中效...
    99+
    2022-11-13
    OpenCV Sobel边缘检测 OpenCV 边缘检测
  • Python中怎么实现Opencv cv2.Canny()边缘检测
    这期内容当中小编将会给大家带来有关Python中怎么实现Opencv cv2.Canny()边缘检测,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 效果图原始图 VS Canny检测效果图如下:2. ...
    99+
    2023-06-20
  • 怎么使用python进行图像边缘检测
    本篇内容主要讲解“怎么使用python进行图像边缘检测”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用python进行图像边缘检测”吧!边缘检测图像边缘是指图像中表达物体的周围像素灰度发生...
    99+
    2023-07-05
  • C语言实现BMP图像边缘检测处理
    本文实例为大家分享了C语言实现BMP图像边缘检测处理的具体代码,供大家参考,具体内容如下 以Sobel算子为例,其余模板算子卷积代码部分同Sobel算子。如:高斯算子、拉普拉斯算子等...
    99+
    2024-04-02
  • Android+OpenCv4实现边缘检测及轮廓绘制出图像最大边缘
    实现步骤: 图像灰度化 边缘检测 根据Canny检测得出来的Mat寻找轮廓 算出最大轮廓周长or面积 根据获取到的最大轮廓下标进行轮廓绘制 ...
    99+
    2024-04-02
  • python进行图像边缘检测的详细教程
    目录边缘检测边缘检测算子1、Roberts算子2、Prewitt算子3、Sobel算子4、Canny算子5、拉普拉斯算子效果实验1、 Roberts边缘检测2、Prewitt 边缘检...
    99+
    2023-05-13
    Python图像边缘检测代码 python 边缘检测抠图 python 图像边缘检测
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作