- N +

给,Python-计算机视觉中的Canny边际检测办法,兴致勃勃的意思

原标题:给,Python-计算机视觉中的Canny边际检测办法,兴致勃勃的意思

导读:

今天的想法是用Canny边缘检测算法,建立一种可以勾画出图像上任何物体的边缘的算法。首先,我们来描述一下Canny边缘检测器。...

文章目录 [+]

Python-核算机视觉中的Canny边沿检测方法

今日的主意是用Canny边沿检测算法,树立一种能够勾画出图画就任何物体的边沿的算法。

首要,咱们来描绘一下Canny边沿检测器:

Canny边沿检测算子是一种边沿检测算子,它选用多级算法检测图画中广泛的边沿。它是由John F. Canny在1986年开发的。Canny还提出了边沿检测的核算理论,解说了该技能的作业原理。

Canny边沿检测算法由5个过程组成:

  1. 降噪;
  2. 梯度核算;
  3. 非最大按捺;
  4. 双阈值;
  5. 滞后边沿盯梢。

运用这些过程后,您将能够取得以下成果:

Python-核算机视觉中的Canny边沿检测方法

左边的原始图画 - 右侧的已处理图画

终究值得一提的是,该算法是依据灰度图画的。因而,在进行上述过程之前,首要要将图画转换为灰度。

降噪

由于场景背面触及的数学首要依据导数(拜见过程2:梯度核算),边沿检测成果对图画噪声高度灵敏。

消除图画噪声的一种方法是运用高斯含糊滑润图画。为此,图画卷积技能运用高斯核(3x3, 5x5, 7x7等)。核巨细取决于预期的含糊作用。基本上,核越小,含糊就越不明显。在咱们的比如中,咱们将运用一个55的高斯核函数。

巨细为(2k+1)(2k+1)的高斯滤波核的方程为:

高斯滤波器核方程

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

import numpy as np
def 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**2 + y**2) / (2.0*sigma**2))) * normal
return g

运用高斯含糊后,咱们得到以下成果:

原始图画(左) - 带有高斯滤波器的含糊图画(sigma = 1.4,核巨细为5x5)

梯度核算

梯度核算过程经过运用边沿检测算子核算图画的梯度来检测边沿强度和方向。

边沿对应于像素强度的改变。要检测它,最简略的方法是运用filt微米手作ers,在两个方向上杰出这种强度改变:水平告密者孔雀是终极间谍(x)和笔直(y)

当滑润图画时,核算导数I慕紫慕容承x和Iy。它能够经过别离用Sobel kernels Kx和Ky别离卷积I来完成:

Sobel filters用于两个方向(水平缓笔直)

然后,梯度的起伏G和斜率核算如下:

梯度强度和边沿方向

下面是Sobel滤镜运用于图画的方法,以及怎么取得强度和边沿方向矩阵,Python代码如下:

from scipy import ndimage
def 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.hypotvalensiyas(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,j + 1)。

让咱们总结一下。每个像素有2个首要规范(弧度的边沿方向和像素强度(0-255之间))。依据这些输入,非最大按捺过程是:

  • 创立一豁翎子个初始化为0的矩阵,该矩阵与原始梯度给,Python-核算机视觉中的Canny边沿检测方法,兴味盎然的意思强度矩阵的巨细相同;
  • 依据视点矩阵的视点值辨认边沿方向;
  • 查看相同方向的像素是否具有比当时处理的像素更高的强度;
  • 回来运用非最大按捺算法处理的图画。

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] += 180

for 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] 给,Python-核算机视觉中的Canny边沿检测方法,兴味盎然的意思= img[i,j]
else:
Z[i,j] = 0
except IndexError as e:
pass

return Z

成果是相同的图画,但边沿更薄。可是,咱们依然能够注意到边沿亮度的一些改变:一些像素好像比其他像素更亮,咱们将测验在终究两个过程中补偿这一缺点。

非最大按捺的成果

双阈值

双阈值过程李小幼旨在辨认3种像素:强,弱和不相关:

  • 强像素是指像素的强度如此之高,以至于咱们坚信它们有助于终究的边沿。
  • 弱像素是具有不足以被视为强的强度值的像素,可是还不足以被以为与边沿检测不相关。
  • 其他像素被以为与边沿无关。

现在你能够看到这两个阈值代表什么:

  • 高阈值用于辨认强像素(强度高于高阈值)
  • 低阈值用于辨认不相关的像素(强度低于低阈值)
  • 具有两个阈值之间的强度的一切像素被标记为弱,滞后机制(下一过程)将协助咱们辨认可被视为强的那些和被以为是不相关的那些。
def thr给,Python-核算机视觉中的Canny边沿检测方法,兴味盎然的意思eshold(img, lowThresholdRatio=0.05, highThresholdRatio=0.09):

hi给,Python-核算机视觉中的Canny边沿检测方法,兴味盎然的意思ghThreshold = 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[str凤氏玄针ong_i, strong_j] = strong
res[weak_i, weak_j] = weak

return (res, weak, strong)

此过程的成果是只要2个像素强度值(强弱)的图画:

非最大按捺图画(左) - 阈值成果(右)

滞后边沿盯梢

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

def hysteresis(img, weak, strong=255):
M, N = img.shape
for i in range(1, M-1):
for j in rang给,Python-核算机视觉中的Canny边沿检测方法,兴味盎然的意思e(1, N-1):
if (i给,Python-核算机视觉中的Canny边沿检测方法,兴味盎然的意思mg[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] =给,Python-核算机视觉中的Canny边沿检测方法,兴味盎然的意思 strong
else:
img[i, j] = 0
except IndexError as e:
pass
return img



有好的文章希望我们帮助分享和推广,猛戳这里我要投稿

返回列表
上一篇:
下一篇: