77百科网
当前位置: 首页 生活百科

python 目标检测(Python-计算机视觉中的Canny边缘检测方法)

时间:2023-07-04 作者: 小编 阅读量: 1 栏目名: 生活百科

今天的想法是用Canny边缘检测算法,建立一种可以勾画出图像上任何物体的边缘的算法。Canny还提出了边缘检测的计算理论,解释了该技术的工作原理。Canny边缘检测算法由5个步骤组成:降噪;梯度计算;非最大抑制;双阈值;滞后边缘跟踪。此外,梯度强度水平在0到255之间,这是不均匀的。弱像素是具有不足以被视为强的强度值的像素,但是还不足以被认为与边缘检测不相关。其他像素被认为与边缘无关。

今天的想法是用Canny边缘检测算法,建立一种可以勾画出图像上任何物体的边缘的算法。

首先,我们来描述一下Canny边缘检测器:

Canny边缘检测算子是一种边缘检测算子,它采用多级算法检测图像中广泛的边缘。它是由John F. Canny在1986年开发的。Canny还提出了边缘检测的计算理论,解释了该技术的工作原理。

Canny边缘检测算法由5个步骤组成:

  1. 降噪;
  2. 梯度计算;
  3. 非最大抑制;
  4. 双阈值;
  5. 滞后边缘跟踪。

应用这些步骤后,您将能够获得以下结果:

左侧的原始图像 - 右侧的已处理图像

最后值得一提的是,该算法是基于灰度图像的。因此,在进行上述步骤之前,首先要将图像转换为灰度。

降噪

由于场景背后涉及的数学主要基于导数(参见步骤2:梯度计算),边缘检测结果对图像噪声高度敏感。

消除图像噪声的一种方法是使用高斯模糊平滑图像。为此,图像卷积技术应用高斯核(3x3, 5x5, 7x7等)。核大小取决于预期的模糊效果。基本上,核越小,模糊就越不明显。在我们的例子中,我们将使用一个5×5的高斯核函数。

大小为(2k 1)×(2k 1)的高斯滤波核的方程为:

高斯滤波器核方程

用于生成Gaussian 5x5内核的Python代码:

import numpy as npdef gaussian_kernel(size, sigma=1): size = int(size) // 2 x, y = np.mgrid[-size:size 1, -size:size 1] normal = 1 / (2.0 * np.pi * sigma**2) g = np.exp(-((x**2y**2) / (2.0*sigma**2))) * normal return g

应用高斯模糊后,我们得到以下结果:

原始图像(左) - 带有高斯滤波器的模糊图像(sigma = 1.4,核大小为5x5)梯度计算

梯度计算步骤通过使用边缘检测算子计算图像的梯度来检测边缘强度和方向。

边缘对应于像素强度的变化。要检测它,最简单的方法是应用filters,在两个方向上突出这种强度变化:水平(x)和垂直(y)

当平滑图像时,计算导数Ix和Iy。它可以通过分别用Sobel kernels Kx和Ky分别卷积I来实现:

Sobel filters用于两个方向(水平和垂直)

然后,梯度的幅度G和斜率θ计算如下:

梯度强度和边缘方向

下面是Sobel滤镜应用于图像的方法,以及如何获得强度和边缘方向矩阵,Python代码如下:

from scipy import ndimagedef sobel_filters(img): Kx = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], np.float32) Ky = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]], np.float32)Ix = ndimage.filters.convolve(img, Kx) Iy = ndimage.filters.convolve(img, Ky)G = np.hypot(Ix, Iy) G = G / G.max() * 255 theta = np.arctan2(Iy, Ix)return (G, theta)

模糊图像(左) - 梯度强度(右)

结果几乎是预期的,我们可以看到,一些边缘是厚的,另一些是薄的。非最大抑制步骤将有助于我们减轻厚的。

此外,梯度强度水平在0到255之间,这是不均匀的。最终结果的边缘应具有相同的强度(即白色像素= 255)。

非最大抑制

理想情况下,最终的图像应该有细边。因此,我们必须执行非最大抑制以使边缘变细。

原理很简单:算法遍历梯度强度矩阵上的所有点,并找到边缘方向上具有最大值的像素。

让我们举一个简单的例子:

上图左上角的红色框表示被处理的梯度强度矩阵的一个强度像素。对应的边缘方向由橙色箭头表示,其角度为-pi弧度( /- 180度)。

聚焦左上角的红色方块像素

边缘方向是橙色虚线(从左到右水平)。该算法的目的是检查在相同方向上的像素是否比被处理的像素强度高或低。在上面的例子中,正在处理像素(i,j),相同方向上的像素用蓝色(i, j-1)和(i, j 1)高亮显示。如果这两个像素中的一个比正在处理的那个更强,那么只保留更强的那个。像素(i, j-1)似乎更强,因为它是白色的(值255)。因此,当前像素(i, j)的强度值设置为0。如果边缘方向上没有具有更强值的像素,则保留当前像素的值。

现在让我们关注另一个例子:

在这种情况下,方向是橙色虚线对角线。因此,该方向上最强的像素是像素(i-1,j1)。

让我们总结一下。每个像素有2个主要标准(弧度的边缘方向和像素强度(0-255之间))。基于这些输入,非最大抑制步骤是:

  • 创建一个初始化为0的矩阵,该矩阵与原始梯度强度矩阵的大小相同;
  • 根据角度矩阵的角度值识别边缘方向;
  • 检查相同方向的像素是否具有比当前处理的像素更高的强度;
  • 返回使用非最大抑制算法处理的图像。

Python代码如下:

def non_max_suppression(img, D): M, N = img.shape Z = np.zeros((M,N), dtype=np.int32) angle = D * 180. / np.pi angle[angle < 0]= 180for i in range(1,M-1): for j in range(1,N-1): try: q = 255 r = 255#angle 0 if (0 <= angle[i,j] < 22.5) or (157.5 <= angle[i,j] <= 180): q = img[i, j 1] r = img[i, j-1] #angle 45 elif (22.5 <= angle[i,j] < 67.5): q = img[i 1, j-1] r = img[i-1, j 1] #angle 90 elif (67.5 <= angle[i,j] < 112.5): q = img[i 1, j] r = img[i-1, j] #angle 135 elif (112.5 <= angle[i,j] < 157.5): q = img[i-1, j-1] r = img[i 1, j 1] if (img[i,j] >= q) and (img[i,j] >= r): Z[i,j] = img[i,j] else: Z[i,j] = 0 except IndexError as e: passreturn Z

结果是相同的图像,但边缘更薄。然而,我们仍然可以注意到边缘亮度的一些变化:一些像素似乎比其他像素更亮,我们将尝试在最后两个步骤中弥补这一缺陷。

非最大抑制的结果

双阈值

双阈值步骤旨在识别3种像素:强,弱和不相关:

  • 强像素是指像素的强度如此之高,以至于我们确信它们有助于最终的边缘。
  • 弱像素是具有不足以被视为强的强度值的像素,但是还不足以被认为与边缘检测不相关。
  • 其他像素被认为与边缘无关。

现在你可以看到这两个阈值代表什么:

  • 高阈值用于识别强像素(强度高于高阈值)
  • 低阈值用于识别不相关的像素(强度低于低阈值)
  • 具有两个阈值之间的强度的所有像素被标记为弱,滞后机制(下一步骤)将帮助我们识别可被视为强的那些和被认为是不相关的那些。

def threshold(img, lowThresholdRatio=0.05, highThresholdRatio=0.09):highThreshold = img.max() * highThresholdRatio; lowThreshold = highThreshold * lowThresholdRatio;M, N = img.shape res = np.zeros((M,N), dtype=np.int32)weak = np.int32(25) strong = np.int32(255)strong_i, strong_j = np.where(img >= highThreshold) zeros_i, zeros_j = np.where(img < lowThreshold)weak_i, weak_j = np.where((img <= highThreshold) & (img >= lowThreshold))res[strong_i, strong_j] = strong res[weak_i, weak_j] = weakreturn (res, weak, strong)

此步骤的结果是只有2个像素强度值(强弱)的图像:

非最大抑制图像(左) - 阈值结果(右)

滞后边缘跟踪

根据阈值结果,当且仅当被处理像素周围至少有一个像素为强像素时,滞后由弱像素转换为强像素构成,如下所述:

def hysteresis(img, weak, strong=255): M, N = img.shapefor i in range(1, M-1): for j in range(1, N-1): if (img[i,j] == weak): try: if ((img[i 1, j-1] == strong) or (img[i 1, j] == strong) or (img[i 1, j 1] == strong) or (img[i, j-1] == strong) or (img[i, j 1] == strong) or (img[i-1, j-1] == strong) or (img[i-1, j] == strong) or (img[i-1, j 1] == strong)): img[i, j] = strong else: img[i, j] = 0 except IndexError as e: pass return img

,
    推荐阅读
  • 朝鲜都有哪些城市(朝鲜国内有哪些)

    在朝鲜,人口超百万的城市只有一座,那就是首都平壤,平壤是朝鲜集全国之力打造的城市。在朝鲜,称得上“一线城市”的也只有平壤。虽然是朝鲜的第二大城市,但和平壤的差距非常明显。在朝鲜,如果说平壤是“一线城市”,那么开城、新义州、南浦、和罗县等城市则属于“二线城市”。新义州是朝鲜平安北道的首府,人口五十多万。因为和我国相邻,新义州是中朝贸易的重要城市,同时也是朝鲜重要的轻工业中心。

  • 昌河铃木北斗星x5是多大马力(昌河铃木北斗星X5价格最新消息)

    2016款1.4L启航型国V2015款1.4L巡航型国V2015款1.0L精英型2015款1.4L巡航型国IV2015款1.4L豪华型铃木豪礼相送北斗星X5外观设计从外观来看,北斗星X5EV的进气格栅由银色镀铬变为白色,并配以蓝色的线条装饰,让人一眼就能将它与汽油版车型区分开来。车尾部分,新车在造型上没有变化,仅在车尾新增了象征电动车身份的“EV268”标识。

  • 剑网3装备外观预览(限量外观返场动了谁的奶酪)

    然而,很多玩家都觉得自己脸太黑了,以剑网3庞大的用户群体来看,2000套肯定轮不到自己,于是纷纷出来抗议。三类玩家:高价购买,不想太亏剑网3以前那些限量外观下架之后,早就成了稀罕物,有些玩家对于某款外观特别喜爱,于是就花大价钱从其他玩家那里连账号一起购买。四类玩家:黄牛党由于剑网3的限量外观升值太快了,于是就出现了很多黄牛党,每次出限量外观时,他们都会囤很多,然后坐等升值。

  • steam青睐之光(奇葩游戏登陆Steam青睐之光)

    Steam青睐之光是一个能征集社区帮助,挑选下一批游戏于Steam上发布的系统。开发者可以为他们的游戏发布信息、截图以及视频,并寻求广大社区玩家的支持,以使该款游戏被选上。然而,最近有一款非常奇葩的游戏《GameaboutNothing》登陆了绿光,这游戏命名还颇为诚实,真的是什么都没有,连预告和截图也都是黑屏,背景音乐更是零。《GameaboutNothing》预告:在放不放这个预告的问题上短笛我犹豫了一下……如果你对这个游戏感兴趣,不妨去Steam青睐之光页面看看。

  • 咸酥蛋挞怎么做(咸酥蛋挞的制作方法)

    跟着小编一起来看一看吧!咸酥蛋挞怎么做先把蛋挞皮放到烤盘上解冻。接着预热烤箱230度。把称好的细砂糖和水放在不锈钢盆子里,搅打到细砂糖完全融化,再把牛奶倒进去,搅拌均匀。准备另一个盘子,把两个全蛋和半个蛋黄打散,吉士粉加进鸡蛋液里,把鸡蛋液和吉士粉搅打均匀。把鸡蛋液和牛奶液混合在一起,然后过筛,这一步不能少,要不然蛋挞液不够细腻顺滑。

  • 皮皮虾水煮多久能熟(皮皮虾水一般煮多久能熟)

    以下内容大家不妨参考一二希望能帮到您!皮皮虾水煮多久能熟冷水入锅,小火煮15-20分钟即可,中火煮需要8-10分钟,不宜用大火煮,会破坏口感。如果使用高压锅,2-3分钟即可。皮皮虾是虾蛄科口虾蛄属动物,头胸甲前缘中央有一片能活动的梯形额角板,前方有能活动的眼节和触角节,腹部宽大,最后另有宽而短的尾节,背面有中央脊,后缘具强棘。

  • 领克06和吉利缤越对比(自主小型SUV怎么选)

    尤其是新车搭载的LED律动大灯,解锁时会产生有规律的灯光秀,提升了时尚感。此外,上下分层式设计的双层立体尾翼,这也是主打性能车最显著的特征之一。内饰方面,领克06仿飞机座舱的设计则更强调驾驶的乐趣,并体现出很强的设计性,能够与车内功能融为一体。空间方面,相比同级其他车型,领克06的空间明显要充裕了很多。前排座椅配备了电动调节等多种功能,能够提供较为舒适的坐姿。此外,领克06还推出了相关的新能源车型。

  • 一万多买一辆电动汽车(花一万块买电动车)

    M110P仅有一种配色,银黑色搭配并带有绿色腰线装饰。仪表盘最具特色的,除了显示动态刷新的剩余续航里程,便是两侧的行驶状态灯了,利用颜色指示当前状态。其实在当前的摩托车市场中,ABS和TCS都没有成为标配功能,仅存在于价位较高的中高端产品上。M110P支持2小时充满的最大15A快速充电,不过专用快速充电器暂未上市,最终价格也可能会像其他九号的快充落在千元上下。

  • 青豆的营养价值及功效(你知道吗)

    青豆的营养价值及功效营养价值:青豆富含B族维生素、铜、锌、镁、钾、纤维、杂多糖类。青豆不含胆固醇,可预防心血管疾病,并减少癌症发生。每天吃两盘青豆,可降低血液中的胆固醇.青豆含有丰富的蛋白质、叶酸、膳食纤维和人体必需的多种氨基酸,尤以赖氨酸含量为高。食用功效:1.预防脂肪肝:青豆富含不饱和脂肪酸和大豆磷脂,有保持血管弹性、健脑和防止脂肪肝形成的作用。