OpenCV实现Sobel边缘检测的示例

目录
  • 一、Sobel算法
    • 1、算法概述
    • 2、主要函数
  • 二、C++代码
  • 三、python代码
  • 四、结果展示
  • 五、相关链接

一、Sobel算法

1、算法概述

Sobel边缘检测算法比较简单,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确,然而在很多实际应用的场合,sobel边缘却是首选,Sobel算子是高斯平滑与微分操作的结合体,所以其抗噪声能力很强,用途较多。尤其是在对效率要求较高,而对细纹理不太关系的时候。

使用Sobel算子提取图像边缘分3个步骤:

提取X方向的边缘,X方向一阶Sobel边缘检测算法为:

提取Y方向的边缘,Y方向一阶Sobel边缘检测算法为:

综合两个方向的边缘信息得到整幅图像的边缘。

2、主要函数

Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
  • src:传入的图像
  • ddepth:图像的深度
  • dxdy:指的是求导的阶数,0表示这个方向上没有求导,所填的数一般为0、1、2。
  • ksize:是Sobel算子的大小,即卷积核的大小,必须为奇数1、3、5、7。如果ksize=-1,就演变成为3x3的Scharr算子,scale是缩放导数的比例常数,默认情况为没有伸缩系数。
  • borderType:是判断图像边界的模式,这个参数默认值为cv2.BORDER_DEFAULT。
  • dstdst之后的参数都是可选参数。

二、C++代码

#include <iostream>
#include <opencv2\opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	//----------------读取图像-----------------
	Mat img = imread("1.jpg");
	//黑白图像边缘检测结果较为明显
	Mat gray_img;
	cvtColor(img, gray_img, COLOR_BGR2GRAY);
	Mat resultX, resultY, resultXY;
	//-------------Sobel边缘检测--------------
	//X方向一阶边缘
	Sobel(img, resultX, CV_16S, 2, 0, 1);
	convertScaleAbs(resultX, resultX);

	//Y方向一阶边缘
	Sobel(img, resultY, CV_16S, 0, 1, 3);
	convertScaleAbs(resultY, resultY);

	//整幅图像的一阶边缘
	resultXY = resultX + resultY;

	//显示图像
	imshow("resultX", resultX);
	imshow("resultY", resultY);
	imshow("resultXY", resultXY);
	waitKey(0);
	return 0;
}

三、python代码

import cv2

img = cv2.imread("1.jpg")
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# -------------------Sobel边缘检测------------------------
x = cv2.Sobel(gray_img, cv2.CV_16S, 1, 0)
y = cv2.Sobel(gray_img, cv2.CV_16S, 0, 1)
# cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])
# 可选参数alpha是伸缩系数,beta是加到结果上的一个值,结果返回uint类型的图像
Scale_absX = cv2.convertScaleAbs(x)  # convert 转换  scale 缩放
Scale_absY = cv2.convertScaleAbs(y)
result = cv2.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)
# ----------------------显示结果----------------------------
cv2.imshow('img', gray_img)
cv2.imshow('Scale_absX', Scale_absX)
cv2.imshow('Scale_absY', Scale_absY)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、结果展示

1、灰度图

2、X方向一阶边缘

2、Y方向一阶边缘

3、整幅图像的一阶边缘

五、相关链接

[1] python+OpenCV图像处理(八)边缘检测

到此这篇关于OpenCV实现Sobel边缘检测的示例的文章就介绍到这了,更多相关OpenCV Sobel边缘检测内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • opencv canny边缘检测算法详解

    目录 一.边缘检测原理 二.canny算法原理 三.opencv函数支持Canny() 四.代码示例: 一.边缘检测原理 图像的边缘由图像中两个相邻的区域之间的像素集合组成,是指图像中一个区域的结束和另外一个区域的开始.也可以这么理解,图像边缘就是图像中灰度值发生空间突变的像素的集合.梯度方向和幅度是图像边缘的两个性质,沿着跟边缘垂直的的方向,像素值的变化幅度比较平缓:而沿着与边缘平行的方向,则像素值变化幅度变化比较大.于是,根据该变化特性,通常会采用计算一阶或者二阶导数的方法来描述和检测图像边

  • Python使用Opencv实现边缘检测以及轮廓检测的实现

    边缘检测 Canny边缘检测器是一种被广泛使用的算法,并被认为是边缘检测最优的算法,该方法使用了比高斯差分算法更复杂的技巧,如多向灰度梯度和滞后阈值化. Canny边缘检测器算法基本步骤: 平滑图像:通过使用合适的模糊半径执行高斯模糊来减少图像内的噪声. 计算图像的梯度:这里计算图像的梯度,并将梯度分类为垂直.水平和斜对角.这一步的输出用于在下一步中计算真正的边缘. 非最大值抑制:利用上一步计算出来的梯度方向,检测某一像素在梯度的正方向和负方向上是否是局部最大值,如果是,则抑制该像素(像素不属于

  • Python+OpenCV 图像边缘检测四种实现方法

    目录 1.Sobel算子 2.Schaar算子(更能体现细节) 3.Laplacian算子(基于零穿越的,二阶导数的0值点) 4.Canny边缘检测(被认为是最优的边缘检测算法) 总结 import cv2 as cv import numpy as np import matplotlib.pyplot as plt # 设置兼容中文 plt.rcParams['font.family'] = ['sans-serif'] plt.rcParams['font.sans-serif'] = [

  • Python OpenCV实现边缘检测

    本文实例为大家分享了Python OpenCV实现边缘检测的具体代码,供大家参考,具体内容如下 1. Sobel 算子检测 Sobel 算子是高斯平滑和微分运算的组合,抗噪能力很强,用途也很多,尤其是效率要求高但对细纹理不是很在意的时候. 对于不连续的函数,有: 假设要处理的图像为I,在两个方向求导. 水平变化:用奇数大小的模板对图像I卷积,结果为Gx.例如,当模板大小为3时,Gx为: 垂直变化:用奇数大小的模板对图像I卷积,结果为Gy.例如,当模板大小为3时,Gy为: 在图像的每个点,结合以上

  • OpenCV中Canny边缘检测的实现

    目录 1. Canny 边缘检测理论 1.1.高斯滤波 1.2.Sobel算子计算梯度和方向 1.3.非极大值抑制(定位准确的边缘同时可缩小边缘线宽) 1.4.双阈值检测 2. OpenCV 之 Canny 边缘检测 边缘检测一般是识别目标图像中亮度变化明显的像素点. 因为显著变化的像素点通常反映了图像变化比较重要的地方. 1. Canny 边缘检测理论 Canny 是一种常用的边缘检测算法. 其是在 1986 年 John F.Canny 提出的. Canny 是一种 multi-stage

  • C++ opencv图像处理实现图片边缘检测示例

    目录 边缘检测简介 一.边缘检测步骤 二.Canny 1.函数 2.代码 二.Sobel 1.函数 2.代码 三.Scharr 1.函数 2.代码 四.Laplacian 1.函数 2.代码 总结 边缘检测简介 边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点. 图像边缘检测大幅度地减少了数据量,并且剔除量不相关的信息,保留了图像重要的结构属性. 一.边缘检测步骤 1.图像获取 2.图像滤波 3.图像增强 4.图像检测 5.图像定位 二.Canny 1.

  • python opencv实现图像边缘检测

    本文利用python opencv进行图像的边缘检测,一般要经过如下几个步骤: 1.去噪 如cv2.GaussianBlur()等函数: 2.计算图像梯度 图像梯度表达的是各个像素点之间,像素值大小的变化幅度大小,变化较大,则可以认为是出于边缘位置,最多可简化为如下形式: 3.非极大值抑制 在获得梯度的方向和大小之后,应该对整幅图像做一个扫描,去除那些非边界上的点.对每一个像素进行检查,看这个点的梯度是不是周围具有相同梯度方向的点中最大的.如下图所示: 4.滞后阈值 现在要确定那些边界才是真正的

  • OpenCV实现图像边缘检测

    最近自己在做一个有关图像处理的小项目,涉及到图像的边缘检测.直线检测.轮廓检测以及角点检测等,本文首先介绍图像的边缘检测,使用的是Canny边缘检测算法,具体代码以及检测效果如下: 1.代码部分: // Image_Canny.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <cv.h> #include "highgui.h" using namespace cv; int _tmain(int

  • Python实现Opencv cv2.Canny()边缘检测

    目录 1. 效果图 2. 源码 补充:OpenCV-Python 中 Canny() 参数 这篇博客将介绍Canny边缘检测的概念,并利用cv2.Canny()实现边缘检测: Canny边缘检测是一种流行的边缘检测算法.它是由约翰F开发的,是一个多阶段的算法: Canny边缘检测大致包含4个步骤: 降噪(使用高斯滤波去除高频噪声): 计算边缘梯度和方向(SobelX.SobleY核在水平方向和垂直方向对平滑后的图像进行滤波,找到每个像素的边缘梯度和方向): 非最大抑制(在得到梯度大小和方向后,对

  • OpenCV 边缘检测

    边缘在人类视觉和计算机视觉中均起着重要的作用. 人类能够仅凭一张背景剪影或一个草图就识别出物体类型和姿态. 其中OpenCV提供了许多边缘检测滤波函数,这些滤波函数都会将非边缘区域转为黑色,将边缘区域转为白色或其他饱和的颜色. 不过这些滤波函数都很容易将噪声错误地识别为边缘,所以需要进行模糊处理. 本次的模糊操作使用高斯模糊(低通滤波器),最常用的模糊滤波器(平滑滤波器)之一,是一个削弱高频信号强度的低通滤波器. 低通滤波器,在像素与周围像素的亮度差值小于一个特定值时,平滑该像素的亮度,主要用于

随机推荐