- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
感谢阅读本文,请原谅我的英语不好,因为我不是母语人士。
例如索贝尔算子: http://en.wikipedia.org/wiki/Sobel_operator
Gx右正左负,Gy上正。
我不是图像处理专家。但我认为大多数人都是从图像的左上角开始计算像素的。既然在卷积的过程中需要“翻转”内核,为什么在定义算子时Gx不是镜像的,为了更好的正则性?
从技术上讲,我知道这不是编程问题。但它与编程有关。比如python的scipy.ndimage
就提供了sobel
函数。该函数使用左列为正,右列为负的内核。它不同于我能找到的所有关于图像处理的资料(包括维基百科文章)。是否有任何特殊原因导致实际实现与数学定义不同?
最佳答案
首先,让我稍微改一下您的问题:
为什么 scipy.ndimage
版本的 Sobel 运算符似乎与维基百科上给出的定义相反?
以下是显示差异的并排比较。对于输入,我们使用维基百科文章中的自行车图像:http://en.wikipedia.org/wiki/File:Bikesgray.jpg
import matplotlib.pyplot as plt
import numpy as np
import scipy.ndimage as ndimage
# Note that if we leave this as unsigned integers we'll have problems with
# underflow anywhere the gradient is negative. Therefore, we'll cast as floats.
z = ndimage.imread('Bikesgray.jpg').astype(float)
# Wikipedia Definition of the x-direction Sobel operator...
kernel = np.array([[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]], dtype=float)
sobel_wiki = ndimage.convolve(z, kernel)
# Scipy.ndimage version of the x-direction Sobel operator...
sobel_scipy = ndimage.sobel(z, axis=1)
fig, axes = plt.subplots(figsize=(6, 15), nrows=3)
axes[0].set(title='Original')
axes[0].imshow(z, interpolation='none', cmap='gray')
axes[1].set(title='Wikipedia Definition')
axes[1].imshow(sobel_wiki, interpolation='none', cmap='gray')
axes[2].set(title='Scipy.ndimage Definition')
axes[2].imshow(sobel_scipy, interpolation='none', cmap='gray')
plt.show()
请注意,值已有效翻转。
这背后的逻辑是 Sobel 过滤器基本上是一个梯度运算符(numpy.gradient
等同于与 [1, 0, -1]
的卷积,除了在边缘)。维基百科给出的定义给出了梯度数学定义的负数。
例如,numpy.gradient
给出了与 scipy.ndimage
的 Sobel 过滤器类似的结果:
import matplotlib.pyplot as plt
import numpy as np
import scipy.ndimage as ndimage
z = ndimage.imread('/home/jofer/Bikesgray.jpg').astype(float)
sobel = ndimage.sobel(z, 1)
gradient_y, gradient_x = np.gradient(z)
fig, axes = plt.subplots(ncols=2, figsize=(12, 5))
axes[0].imshow(sobel, interpolation='none', cmap='gray')
axes[0].set(title="Scipy's Sobel")
axes[1].imshow(gradient_x, interpolation='none', cmap='gray')
axes[1].set(title="Numpy's Gradient")
plt.show()
因此,scipy.ndimage
使用的约定与我们对数学梯度的期望一致。
附注:通常被称为“sobel 滤波器”的实际上是从沿不同轴的两个 sobel 滤波器计算的梯度大小。在 scipy.ndimage
中,您可以将其计算为:
import matplotlib.pyplot as plt
import scipy.ndimage as ndimage
z = ndimage.imread('/home/jofer/Bikesgray.jpg').astype(float)
sobel = ndimage.generic_gradient_magnitude(z, ndimage.sobel)
fig, ax = plt.subplots()
ax.imshow(sobel, interpolation='none', cmap='gray')
plt.show()
在这种情况下使用哪种约定也无关紧要,因为重要的是输入梯度的绝对值。
无论如何,对于大多数用例,具有可调节窗口的更平滑的梯度过滤器(例如 ndimage.gaussian_gradient_magnitude
)是边缘检测的更好选择。
关于python - 为什么图像卷积算子的方向不直观?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26827391/
我关注了这个:How can I enable Flutter/Dart language experiments? 但是,传播运算符仍然对我不起作用。 最佳答案 您需要从终端运行 flutter u
在各种场合我都希望收到一个 Rx Replay 缓冲传入通知的运算符,在第一次订阅时同步重放其缓冲区,然后停止缓冲。此轻量级 Replay运营商应该只能为一个用户提供服务。可以找到此类运算符的一个用例
var items = []; var index = 0; var value = items[index]; // returns invalid value error, understood!
我想在文本中找到笔划的方向。 Sobel 算子如何用于此目的? 这张图显示的是dp,也就是梯度方向。我想知道如何应用 Sobel 运算符找到要选择的像素,从 p 到 q,沿着路径 sp,到找到边缘上的
我正在尝试在水平和垂直方向上实现 sobel 运算符。但不知何故我得到了反向输出。我在下面附上的代码。对于水平蒙版 char mask [3][3]= {{-1,-2,-1},{0,0,0},{1,
我在使用 Sobel 算子进行边缘检测时遇到问题:它会产生太多假边缘,效果如下图所示。我正在使用 3x3 sobel 运算符 - 首先提取垂直然后水平,最终输出是每个滤波器输出的幅度。合成图像的边
我很难理解 &^ and &^= operators 是什么在围棋中的意思。我无法在文档(说明操作符有点清晰,但对我帮助不大)或试验中找到答案。 特别是,我想知道 Python 中是否有等效项。 最佳
我目前正在从包含体素的 MRI 数据量中去除不均匀性。我想在这些体积上应用 sobel 算子来找到梯度。我熟悉 2d sobel mask 和 2d 图像的邻域。 索贝尔面具: 1 2 1 0 0 0
Img 是我输入的 RGB 图像 import cv2 import numpy as np img = cv2.imread("Lenna.png") black = cv2.cvtColor(im
我正在用 C#.net 做人脸检测项目,在某些情况下,我从 sobel 获得了更好的结果,而在其他一些情况下,我从 canny 获得了更好的结果。但实际上哪个更好? 最佳答案 Canny 建立在 So
我是一名优秀的程序员,十分优秀!