【问题标题】:opencv canny: Do minVal and maxVal matter if you're working with a black and white image?opencv canny:如果您使用黑白图像,minVal 和 maxVal 重要吗?
【发布时间】:2016-01-30 13:28:55
【问题描述】:

前言:这是this question的延续。

考虑以下代码,取自here

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

img = cv2.imread('messi5.jpg',0)
edges = cv2.Canny(img,100,200) # Would 100 and 200 matter if your original image was black and white?

plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])

plt.show()

我的问题:

  • 在使用 open cv 的 canny 函数时,如果您使用的是黑白图像,您对 minVal 和 maxVal 的选择是否重要?

我问的原因:

  • 我尝试了许多值,但它们似乎并不重要。

【问题讨论】:

  • 见三木的回答。但正如一个想法:对于 bw 图像,可能有比 canny 更好(更有效)的边缘检测技术。

标签: opencv opencv3.0 edge-detection canny-operator


【解决方案1】:

阈值确实很重要。


假设3x3 Sobel 过滤器(如Canny),对于输入二进制(0, 255) 图像,dxdy 的可能值是:

-1020, -765, -510, -255, 0, 255, 510, 765, 1020

可能的幅度值是:

  1. L1(默认):0, 510, 1020, 1530
  2. L2 : 0, 360.63, 510, 721.25, 806.38, 1020, 1081.87, 1140.40

因此,如果您使用例如(minVal, maxVal) 作为(200,400)(400,600),您将从Canny 获得不同的输出图像。

如果您使用相同区间的阈值(区间的边界是上面显示的幅度值),那么您将始终得到相同的结果。

【讨论】:

  • 注意:sobel 内核看起来像 [[-1,-2,-1], [0,0,0], [+1,+2,+1]]。所以极端情况是与内核对齐的硬梯度,4 * 255 - 4 * 0 = 1020(和其他等价物)。这解释了第一组数字。 x 和 y 内核不能同时最大化(不可能有这样的值的 3x3 补丁),因此 L1 范数必须小于 2*1020。我不在乎推导出 1530 的数字,但它可能是正确的。
  • @ChristophRackwitz 我不记得 6 年前我是如何计算这些值的......也没有人仔细检查它们,所以可能存在一些错误:)
  • 所有值都签出。在这些内核下评估所有 2^9=512 个可能的图像很快。这是python中的几行。有用的是np.binary_repr(num, width=9),把数字变成位数组
  • @ChristophRackwitz 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 2011-11-29
  • 2023-03-17
  • 2011-09-29
  • 1970-01-01
相关资源
最近更新 更多