与青春有关的日子,计算机视觉中的Python- Canny边缘检测方法,秦岚

今日的主意是用Canny边际检测算法,树立一种能够勾画出图画就任何物体的边际与芳华有关的日子,核算机视觉中的Python- Canny边际检测办法,秦岚的算法。

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

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

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

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

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

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

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

降噪

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

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

巨细为(2k+1)(2k+1)的高与芳华有关的日子,核算机视觉中的Python- Canny边际检测办法,秦岚斯滤波核的方程为:

高斯滤波器核方程

用于生成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)

梯度核算

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

边际对应于像素强度的改变。要检测它,最简略的办法是运用filters,在两个方向上杰出这种强度改变:水平(x)和笔直(y)

当滑润图画时,核算导数Ix和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]],与芳华有关的日子,核算机视觉中的Python- Canny边际检测办法,秦岚 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)。

非最大按捺

抱负情况下,终究的图画应该有细边。因而,咱们有必要履行非最大按捺以使边际变细。

原理很简略:算法遍历梯嘴巴苦是怎么回事度强度矩阵上的一切1976年属什么点,并找到边际方向上具有最大值的像素。

让咱们举一个简略的比如:

上图左上角的赤色框表明被处理的梯度强度矩阵的一个强度像素。对应的边际方向由橙色箭头表明,其视点为-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代码如下:

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与芳华有关的日子,核算机视觉中的Python- Canny边际检测办法,秦岚 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+与芳华有关的日子,核算机视觉中的Python- Canny边际检测办法,秦岚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]
#a渔船公媳妇ngle 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:
pass

return 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 >= howlowThreshold))

res[strong_i, strong_j] = strong
res[weak_i, weak_j] = weak

return (res, weak, strong)

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

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

滞后边际盯梢

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

def hysteresis(img, weak, str与芳华有关的日子,核算机视觉中的Python- Canny边际检测办法,秦岚ong=255):
M, N = img.shape
for 黄星澄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] == 与芳华有关的日子,核算机视觉中的Python- Canny边际检测办法,秦岚strong) or (img[i-1, j] == strong) or (img[i-1, j+1] == strong)):
img[i, j] = strong
else:
i贵州省人民医院mg[i, j] = 0
except IndexEr盗墓小说ror as e:
pass
return img



评论(0)