OpenCV入门笔记(五) 边缘检测

这里介绍三种边缘检测的方法, Sobel算子(索贝尔算子)Laplacian算子(拉普拉斯算子)Canny算子 的边缘检测。

一、Sobel算子

Sobel算子在一阶偏导上检测边缘,且能在水平(x 方向)和竖直(y 方向)分别作用。直观上,Sobel寻找这样的边缘:中间灰度值特别大,两边很小,即像素值出现跳跃的现象。我们可以通过求梯度值来确定。

x 和 y 两个方向的核函数如下:

????1?2?1000+1+2+1???(Gx)

???+10?1+20?2+10?1???(Gy)

若要同时考虑两个方向,则用

|G|=(Gx)2+(Gy)2????????????√2

或者为了方便,直接用绝对值的和

|G|=|Gx|+|Gy|

核函数和图像的卷积过程,其实是梯度的一个近似,从核函数的结构上可以看出来。注意Kernel的大小需是奇数。


二、Laplacian算子

Laplacian算子偏重在二阶导数上寻找边缘。因为前面讲到的Sobel算子,其中边缘的一阶导数的极大值时,往往伴随着二阶导数取 0 的情况。

Laplacian算子定义如下:

Laplacian(f)=?2f?x2+?2f?y2


三、代码示例

代码示例如下,展示【原图】,【Sobel算子】,【x方向】,【y方向】,和【Laplacian算子】后的效果。

import cv2

# 读入并转化成灰度图
img = cv2.imread("1.jpg", 0)

# 加特效!
sobel = cv2.Sobel(img, cv2.CV_8U, 1, 1, ksize = 5)
sobel_x = cv2.Sobel(img, cv2.CV_8U, 1, 0, ksize = 5)
sobel_y = cv2.Sobel(img, cv2.CV_8U, 0, 1, ksize = 5)

laplacian = cv2.Laplacian(img, cv2.CV_8U)

# 创建窗口
cv2.namedWindow("origin", cv2.WINDOW_NORMAL)
cv2.namedWindow("sobel x", cv2.WINDOW_NORMAL)
cv2.namedWindow("sobel y", cv2.WINDOW_NORMAL)
cv2.namedWindow("sobel", cv2.WINDOW_NORMAL)
cv2.namedWindow("laplacian", cv2.WINDOW_NORMAL)

# 显示
cv2.imshow("origin", img)
cv2.imshow("sobel x", sobel_x)
cv2.imshow("sobel y", sobel_y)
cv2.imshow("sobel", sobel)
cv2.imshow("laplacian", laplacian)

cv2.waitKey(0)
cv2.destroyAllWindows()


效果图如下:


四、Canny算子

Canny算子像Sobel算子那样,也有两个方向的核函数,不同的是,Canny会组合成四个方向的导数,每个方向达到局部最大值才能是边缘的候选点。

Canny算法有两个阈值,设小的阈值为 t1, 大的阈值为 t2,

若小于小的阈值,即 t<t1,直接抛弃;

若大于大的阈值,即 t>t2,则直接判定为边缘像素;

若是处于中间,t1<t<t2,则必须和确定的边缘像素(大于最大阈值)相连才能进一步判断为边缘像素。



代码示例,创建一个滑动条,可以动态改变两个阈值

import cv2

threshold_one = 100
threshold_two = 200

# 下阈值改变
def refresh_x(x):
    global threshold_one
    threshold_one = x
    refresh()

# 上阈值改变
def refresh_y(y):
    global threshold_two
    threshold_two = y
    refresh()

# 刷新Canny检测
def refresh():
    global threshold_one
    global ghreshold_two
    print ‘x = %d, y = %d‘ %(threshold_one, threshold_two)

    canny = cv2.Canny(blur, threshold_one, threshold_two)
    cv2.imshow("canny", canny)

# 读入并转成灰度图
img = cv2.imread("1.jpg", 0)

# 高斯模糊,减少噪点
blur = cv2.GaussianBlur(img, (5, 5), 0)

# 检测边缘
canny = cv2.Canny(blur, 100, 200)

# 创建窗口
cv2.namedWindow("origin", cv2.WINDOW_NORMAL)
cv2.namedWindow("canny", cv2.WINDOW_NORMAL)

# 创建进度条
cv2.createTrackbar("threhold one: ", "canny", 0, 255, refresh_x)
cv2.createTrackbar("threhold two: ", "canny", 0, 255, refresh_y)

# 显示
cv2.imshow("origin", img)
cv2.imshow("canny", canny)

cv2.waitKey(0)
cv2.destroyAllWindows()


限于篇幅,图片效果就不放出来了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 19:11:49

OpenCV入门笔记(五) 边缘检测的相关文章

OpenCV入门笔记(六) 形态学变换

形态学变换(Morphological Transformations),其实是数学上的一个分支,是基于形状的一些列图像处理操作.OpenCV提供了很多方便而有用的操作函数. 一.腐蚀和膨胀(erosion & dilation) 腐蚀(erosion)和膨胀(dilation)是形态学中两个最基本的操作.他们结合后又会衍生出其他很多种复杂的过程.其基本思想很简单,就是用一个核函数,扫过原图像,用覆盖的区域中最值代替锚点(锚点即核函数当前的中心点,即扫描的中心点).下面是苏东坡<水调歌头·明

OpenCV入门笔记(二) 图片的文件操作

以下介绍一下重要的几个,设计基本 图片处理 的函数,依次来了解OpenCV的入门知识.具体的具体使用方法还是以官方的API[Official Tutorials][Python-OpenCV]为准. imread 图片读取函数.使用方法例如以下 # read image with color img = cv2.imread("./lena.jpg") # OR read gray image imgGray = cv2.imread("./lena.jpg", 0

OpenCV入门笔记(四) 形态学变换

形态学变换(Morphological Transformations),其实是数学上的一个分支,是基于形状的一系列图像处理操作.OpenCV提供了很多方便而有用的操作函数. 一.腐蚀和膨胀(erosion & dilation) 腐蚀和膨胀 是形态学中两个最基本的操作.他们结合后又会衍生出其他很多种复杂的过程.其基本思想很简单,就是用一个 核函数,扫过原图像,用覆盖的区域中最值代替锚点(核函数当前的中心点,即扫描的中心点).下面是苏东坡<水调歌头·明月几时有>的楷体图片,我们来看看腐

OpenCV入门笔记(三) 图片处理

OpenCV中提供了很多处理图片的强大函数,可以对很多格式的图片加特效!有点实现Photoshop里的工具的感觉. 下面先介绍一些简单和常见的特效. 二值化(Image Threshold) 参考这里:Image Processing 二值化只能处理灰度图,而所谓的灰度图,就是一幅只用 0-255 这个范围来表示每一个像素点的图像.灰度图没有色彩信息,看起来灰萌灰萌哒:但是又不完全只有黑白两种颜色. 二值化,顾名思义,就是把灰度图的0-255的范围,映射到 0 和 1 两个值上.最简单的做法,便

OpenCV入门笔记(六) 轮廓检测(Detect Contours)

轮廓(Contours),指的是有相同颜色或者密度,连接所有连续点的一条曲线.检测轮廓的工作对形状分析和物体检测与识别都非常有用. 在轮廓检测之前,首先要对图片进行二值化或者Canny边缘检测.在OpenCV中,寻找的物体是白色的,而背景必须是黑色的,因此图片预处理时必须保证这一点. cv2.findContours函数 Python版示例如下,也可以参考[OpenCV-Python教程(11.轮廓检测)][Contours : Getting Started] contours, hierar

OpenCV入门笔记(一) Linux下的安装

关于OpenCV,有中文的官方网站,里面翻译了官网的教程和API等.中文官方Tutorials见这里:[Tutorials] 一.Ubuntu下的安装 可以选择直接从库里安装,或者手动编译安装,请参考这里:[Installation in Linux] 1. 从repository(库)中安装 sudo apt-get install libopencv-dev python-opencv 2. 手动编译安装 首先要解决OpenCV的依赖问题,直接在终端下执行 sudo apt-get inst

OpenCV入门:(五:更改图片对比度和亮度)

1. 理论 图片的转换就是将图片中的每个像素点经过一定的变换,得到新像素点,新像素点组合成一张新的图片. 改变图片对比度和亮度的变换如下: 其中α和β被称作增益参数(gain parameter)和偏差参数(bias parameter),分别控制对比度和亮度. 2. 实现代码 使用上述公式实现改变对比度和亮度的代码如下: void ContrastAndBrightness(const Mat& Src,Mat& Dst,double alpha,double beta) { Dst =

opencv入门笔记之四 读写视频 捕捉移动点

捕捉移动点时,  我们可以使用一种叫做 光学流动(optical flow) 的算法,  在关键点的周围,  所有点的流动导数都是相同的,  从而我门可以判断出关键点( feature points) 下面是代码: classCameraCaliberator { vector<vector<Point3f>> objectPoints; // the real points vector<vector<Point2f>> imagePoints; // p

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

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们将一起学习OpenCV中