计算机视觉算法— canny 边缘探测

边缘提取

图像的边缘是灰度值急剧变化的位置,图像中亮度明显急剧变化的点。从心里学上研究,通常都会图像感知很重要。甚至只考虑图像边缘就可以理解图像的内容。而且边缘对光照的变换就不那么敏感,所以有时候需要通过手段来检查边缘。

为什么要研究边缘

边缘线条会给我们带来大量关于图像信息,线条可以事物之间边界线,也可以事物阴影区域都是线条。边缘检测用于图像分割,提取图像形状的信息,那么边缘检测也就是用二值图表示出图片中边缘信息。所以在图像中,线条相对于颜色和纹理,显得格外重要。能够给我们带来大量的信息。我们无需色彩,仅单色的线条图就可以清楚来表达一些信息,而且这些信息足够反应图像的语义。

  • 编码图像中的语义与形状信息
  • 相对于像素表示,边缘表示显然更加紧凑

边缘的种类

  • 表面法向不连续
  • 深度不连续
  • 表面颜色不连续
  • 光照不连续
截屏2020-08-15下午8.04.48.png

Canny 边缘探测

Canny 算子检测出边相对于其他边缘检测检测出边的效果显著不同就是,Canny 检测出的边是比较细且清晰,更加便于接下来进行的分析。

基于 Canny 算子的边缘检测主要有如下几个步骤,依次是高斯滤波、像素梯度计算、非极大值抑制、滞后阈值处理。

  • 高斯滤波
  • 梯度运算
  • 非极大值抑制
  • 滞后阈值

梯度计算

对于一个连续函数我们通过对某一点进行求导来计算函数在该点的导数,导数反应了函数(曲线)在该点的变化率。

f^{\prime}(x) = f(x + \Delta x) - f(x)

在二维连续数集上有函数f(x,y),我们也可以通过求导过程,该函数在 x 和 y 分量的偏导数,根据定义有:

\begin{aligned} \frac{\partial f(x,y)}{\partial x} = f(x + \Delta x,y) - f(x,y)\\ \frac{\partial f(x,y)}{\partial y} = f(x ,y + \Delta y) - f(x,y) \end{aligned}
对于图像来说,是一个二维的离散型数集,通过推广二维连续型求函数偏导的方法,来求得图像的偏导数,即在 (x,y) 处的最大变化率,也就是这里的梯度

\begin{aligned} g_x = \frac{\partial f(x,y)}{\partial x} = f(x+1,y) - f(x,y)\\ g_y = \frac{\partial f(x,y)}{\partial y} = f(x+1,y) - f(x,y)\\ \end{aligned}

接下里我们就用梯度形式来

\nabla f = grad(f) = [g_x,g_y]^T
对于梯度是由方向和大小的,好那么什么又是梯度的大小、什么又是梯度的方向呢。接下来用公式给大家展示一下,记作幅值

\begin{aligned} M(x,y) = mag(\nabla f) = \sqrt{g_x^2 + g_y^2} \\ \end{aligned}

为了减小开销可以将梯度模表示为
M(x,y) = |g_x| + |g_y|

方向表示为
\alpha(x,y) = \arctan \begin{bmatrix} \frac{g_y}{g_x} \end{bmatrix}

非极大值抑制

抑制不是极大值的元素,局部最大搜索,排除干扰。根据梯度运算得出每个像素点的梯度方向和大小归类。中心点与其所属方向上像素点进行幅值比较,是否大于该方向所有像素点梯度幅值。是则为灰度值为幅值否则幅度值为 0。


028.jpeg

滞后阈值

029.gif

有些位置边并不连续,阈值如何设置过高将许多原本是线位置设置,如果将阈值设置过低就会细碎边,我们希望效果是找到清晰物体的轮廓。这些。

009.jpeg

经过非极大值抑制后图像检测出边还是有许多灰色而且不算清晰。所以接下来设置双阈值,规定上下阈值,所谓双阈值就是有两个阈值分别是低阈值和高阈值。如果像素点灰度值是大于最大阈值就直接将其更新为 255 。如果像素点的灰度值小于最小阈值就将其灰度值更新为 0。如果像素点灰度值是处于最大阈值到最小阈值之间的值,就看其 8 邻域中是否有大于最大阈值的值,如果有也就将其归为 255。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

img = cv.imread("messi5.jpg",0)

titles = ['image']
images = [img]
for i in range(1):
    plt.subplot(1,1,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])

plt.show()
img = cv.imread("messi5.jpg",0)
canny = cv.Canny(img,100,200,)

titles = ['image','canny']
images = [img,canny]
for i in range(2):
    plt.subplot(1,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容