【问题标题】:Is there a way to detect if a filter exists in an image or not?有没有办法检测图像中是否存在过滤器?
【发布时间】:2020-12-10 17:49:05
【问题描述】:

我正在关注 Andrew Ng 的 video1 video2 进行边缘检测,我正在尝试检测图像中是否存在过滤器。
因此,如果我有 2 个图像和 2 个过滤器(1 个检测水平线,1 个检测垂直线):

import numpy as np
from scipy.signal import convolve2d

img = np.array([[10,10,10,0,0,0],[10,10,10,0,0,0],[10,10,10,0,0,0],[10,10,10,0,0,0],[10,10,10,0,0,0],[10,10,10,0,0,0]])
img2 = np.array([[10,10,10,0,0,0],[10,10,10,0,0,0],[10,10,10,0,0,0],[0,0,0,10,10,10],[0,0,0,10,10,10],[0,0,0,10,10,10]])

vertical = np.array([[1,0,-1],[1,0,-1],[1,0,-1]])
horizontal = np.array([[1,1,1], [0,0,0], [-1,-1,-1]])

我尝试使用对每个图像的过滤器进行卷积

print(convolve2d(img, vertical, 'valid'))
[[  0 -30 -30   0]
 [  0 -30 -30   0]
 [  0 -30 -30   0]
 [  0 -30 -30   0]]
print(convolve2d(img, horizontal, 'valid'))
[[0 0 0 0]
 [0 0 0 0]
 [0 0 0 0]
 [0 0 0 0]]

如果过滤器存在或不存在,有没有办法创建一个返回 1 / 0 的函数?
img2这样更复杂的图像会变得更复杂:

print(convolve2d(img2, vertical, 'valid'))
[[  0 -30 -30   0]
 [  0 -10 -10   0]
 [  0  10  10   0]
 [  0  30  30   0]]
print(convolve2d(img2, horizontal, 'valid'))
[[  0   0   0   0]
 [-30 -10  10  30]
 [-30 -10  10  30]
 [  0   0   0   0]]

所以我试图想出一个函数来返回过滤器存在的百分比,但被卡住了。

【问题讨论】:

  • 过滤器存在是什么意思?
  • 例如,在print(convolve2d(img, horizontal, 'valid')) 中可以看到输出是一个全为0的数组——表示过滤器(水平)没有出现在图像中。那是因为图像(img)中没有横线,只有竖线
  • 尝试np.any(convolve2d(img, vertical, 'valid')) 查看真/假陈述。您可以使用int 命令将它们转换为整数。
  • 谢谢凯特!这适用于第一张图像,但不适用于第二张图像。我也可以简单地对数组求和,看看它是否大于 0。但正如我提到的更复杂的图像(如print(convolve2d(img2, vertical, 'valid'))
  • 上述方法应该适用于所有图像...你能澄清一下什么不起作用吗?

标签: python machine-learning conv-neural-network


【解决方案1】:

根据 cmets 中的对话,我们决定计算零(或矩阵中非常小的值)的百分比。假设矩阵是arr。那么,

mask = np.where(abs(arr) < 0.00001, 0, 1)
percent_zeros = np.mean(mask)

其中0.00001 是阈值(低于此值,我们假设所有条目都是零),percent_zeros 输出数组中非零的比率(值介于 0 和 1 之间),其中 1 表示存在矩阵中没有零。

【讨论】:

  • 美丽优雅的解决方案!谢谢凯特:)
猜你喜欢
  • 2012-02-14
  • 2020-04-01
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
相关资源
最近更新 更多