目录

边缘检测

边缘检测:边缘检测指的是灰度发生剧烈变化的位置,边缘检测的目的是制作一个线图,在不会损害图像内容的情况下,大大减少图像的数据量,提供对图像数据的合适概述。

Sobel算子


其中Gx表示x方向的Sobel算子,用于检测y方向的边缘; Gy表示y方向的Sobel算子,用于检测x方向的边缘(边缘方向和梯度方向垂直)。

原型

Sobel算子依然是一种过滤器,只是其是带有方向的。在OpenCV-Python中,使用Sobel的算子的函数原型如下:

Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
参数:
第一个参数是需要处理的图像;
第二个参数是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度;
dx和dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0、1、2。

代码

import os
import cv2
import matplotlib.pyplot as pltimg = cv2.imread('./image/lena_50.jpg') # 读取图像
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    # 转化为灰度图
blur = cv2.GaussianBlur(img_gray, (3, 3), 0) # 高斯滤波处理原图像降噪x = cv2.Sobel(blur, cv2.CV_16S, 1, 0)   # Sobel函数求完导数后会有负值,还有会大于255的值
y = cv2.Sobel(blur, cv2.CV_16S, 0, 1)   # 使用16位有符号的数据类型,即cv2.CV_16S
Scale_absX = cv2.convertScaleAbs(x)  # 转回uint8
Scale_absY = cv2.convertScaleAbs(y)
sobel_image = cv2.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)
cv2.imshow('lena_50', img)
# cv2.imshow("absX_process", Scale_absX)
# cv2.imshow("absY_process", Scale_absY)
cv2.imshow('sobel_xy_process', sobel_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在Sobel函数的第二个参数这里使用了cv2.CV_16S。因为OpenCV文档中对Sobel算子的介绍中有这么一句:“in the case of 8-bit input images it will result in truncated derivatives”。即Sobel函数求完导数后会有负值,还有会大于255的值。而原图像是uint8,即8位无符号数,所以Sobel建立的图像位数不够,会有截断。因此要使用16位有符号的数据类型,即cv2.CV_16S。
在经过处理后,别忘了用convertScaleAbs()函数将其转回原来的uint8形式。否则将无法显示图像,而只是一副灰色的窗口。convertScaleAbs()的原型为:

结果

原图:
Sobel算子处理后得到图像:

canny算子

流程

Canny边缘检测算法可以分为以下5个步骤:

  1. 使用高斯滤波器,以平滑图像,滤除噪声。
  2. 计算图像中每个像素点的梯度强度和方向。
  3. 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
  4. 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
  5. 通过抑制孤立的弱边缘最终完成边缘检测。
    具体原理细节可参考:边缘检测之Canny

原型

canny = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])
参数:
第一个参数 处理的原图像,该图像必须为单通道的灰度图;
第二个参数 最小阈值;
第三个参数 最大阈值。

代码

import cv2
import matplotlib.pyplot as pltimg = cv2.imread('./image/lena_50.jpg') # 读取图像img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    # 转化为灰度图
blur = cv2.GaussianBlur(img_gray, (3, 3), 0) # 高斯滤波处理原图像降噪canny_image = cv2.Canny(blur, 50, 150)
cv2.imwrite('./image/canny_image.jpg', canny_image)
cv2.imshow('lena_50', img)
cv2.imshow('canny_process', canny_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果

原图:

Sobel算子处理后得到图像:

【图像处理】canny和sobel边缘检测__python-opencv相关推荐

  1. 图像处理——Canny算子 图像边缘检测:Canny算子、Prewitt算子和sobel算子

    https://blog.csdn.net/fengye2two/article/details/79190759 https://www.jianshu.com/p/bed4ffe996a1

  2. 图像处理3:Sobel边缘检测

    前言 软件版本 vivado :2020.1 Quartus :17.1 正文 边缘检测需要用到的IP核在两款软件中是不一样的 因此,下面分别在两款软件中进行实现 一.在vivado中实现 1.算法流 ...

  3. 【图像处理】——Python图像分割边缘检测算法之一阶梯度算子(Roberts、Prewitt、Sobel、 Kirsch、Canny算子)

    目录 前言 一.边缘检测算法 1.一阶算子 2.二阶算子 二.一阶算子 原图像lena 1.Roberts算子 不同方向的算子模板 梯度的计算 系统代码: 自定义函数代码 结果 2.Prewitt 不 ...

  4. 【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...

  5. OpenCV探索之路(五):图像变换——边缘检测(canny、sobel、laplacian)

    前言 边缘检测的一般步骤: 滤波--消除噪声 增强--使边界轮廓更加明显 检测--选出边缘点 一.Canny算法 Canny边缘检测算法被很多人推崇为当今最优秀的边缘检测算法,所以我们第一个就介绍他. ...

  6. [图像处理]-Canny边缘检测算法

    1.问题描述 在处理图像时,有时我们需要图像的边界或通过边界得到一定的信息,如何有效而准确的找到这些边界并显示出来就了一个问题,而Canny算法则可以很好的解决它. 2.简述Canny算法 Canny ...

  7. Opencv 笔记5 边缘处理-canny、sobel、Laplacian、Prewitt

    一.边缘检测概述 边缘检测是计算视觉中的基本问题,边缘检测的目的是标识图像中亮度变换明显的点.边缘检测大幅度的减少了图像的数据量(分为两种:灰度图像边缘检测和彩色图像边缘检测),并且剔除了不相关的信息 ...

  8. 图像处理2:图像边缘检测(python+opencv)

    边缘的定义及分类 1.梯度滤波器 OpenCV 提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel, Scharr 和 Laplacian.Sobel,Scharr 其实就是求一阶或二阶导数.S ...

  9. OpenCV Sobel 边缘检测

    Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素:当对精度要求不是很高时,是一种较为常用的边缘检测方法. OpenCV中sobe ...

  10. OpenCV入门系列 —— Sobel边缘检测

    OpenCV入门系列 -- Sobel边缘检测 前言 程序说明 输出结果 代码示例 总结 前言 随着工业自动化.智能化的不断推进,机器视觉(2D/3D)在工业领域的应用和重要程度也同步激增(识别.定位 ...

最新文章

  1. SQL Server 2005实现负载均衡的详细介绍
  2. vue 去除路由时候的#
  3. 2015#183;Fool#39;s Day#183;NND
  4. pythonxml模块高级用法_Python利用ElementTree模块处理XML的方法详解
  5. 二级计算机access押题,全国计算机等级考试标准教程:二级Access
  6. ALC--软件定义架构的PLC
  7. 【Flink】FileNotFoundException: JAR file does not exist: -ynm -yst
  8. 报告:2020年NFT总市值达5200万美元
  9. 元月份退休能享受涨养老金的待遇吗?
  10. GIS案例练习-----------第八天
  11. 【手把手教你】使用pyfinance进行证券收益分析
  12. 基于3DGIS+BIM的智慧园区运维管理平台
  13. “电脑族”保健六项注意
  14. Python进行网页自动打卡系统
  15. k8s ipvs模式下vip nodeport规则未创建原因分析
  16. GroupDocs.Conversion Crack,强大 .NET 文档转换组件
  17. IDEA的Project与Structure依赖jar包的方式
  18. 【190319】VC++ C/S结构视频聊天软件源码源代码
  19. 面试中自我介绍的小技巧
  20. sqli-labs靶场通关(Less1-4)

热门文章

  1. Thrift IDL使用方式
  2. 网络---29 socketserver模块并发 连接合法性
  3. java 包之 BeanUtils包的使用
  4. desktop viewer
  5. iOS 开发的9个超有用小技巧
  6. 人和人之间不要靠的太近
  7. 希哲求大神教 技术额
  8. 实现弹出窗口提示_AX
  9. 手把手教你写一个RPC
  10. 九度OJ1451题-信封错装