【问题标题】:How to apply a partial derivative Gaussian kernel to an image with OpenCV?如何使用 OpenCV 将偏导数高斯核应用于图像?
【发布时间】:2016-05-02 21:53:36
【问题描述】:

我正在尝试从一篇论文中重现结果,其中他们将图像与高斯核的水平偏导数进行卷积。我还没有找到使用 OpenCV 实现这一目标的任何方法。那可能吗 ?

我必须得到高斯滤波器,然后手动计算偏导数吗?

【问题讨论】:

  • 不,你可以用 OpenCV 做到这一点。首先构建你的内核(例如here)然后apply it

标签: opencv gaussian derivative


【解决方案1】:

OpenCV 没有内置函数来计算高斯偏导数。但是您可以使用cv::getGaussianKernelcv::filter2D 来执行此操作。

例如:

  cv::Mat kernel = cv::getGaussianKernel(3, 0.85, CV_32F);
  kernel = kernel.reshape(1, 1);
  cv::filter2D(img, img, CV_8U, kernel);

请注意cv::getGaussianKernel 返回列过滤器,因此您需要reshape 使其水平。

【讨论】:

  • 没想到这么简单。
  • @akarsakov 这些代码行使用高斯核或它的导数实现卷积?好像是前者
  • 这只是 GaussianBlur 它不是导数
【解决方案2】:

正如@akarsakov 所说,OpenCV 没有为此提供内置函数。但是,我们仍然可以使用 OpenCV 的getGaussianKernel(),然后应用一个因子来得到导数。

由于高斯 2D 内核是可分离的,该函数将简单地返回一个 1D 内核并假设您将沿 x 轴应用 1D 过滤器,然后沿 y 轴应用 1D 过滤器,这比应用更快直接使用 2D 内核。

既然你想要水平高斯导数,ref

您可以简单地将内核的每个点乘以-x/sigma^2

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

kernel_size = 13
sigma = 0.5
kernel = cv2.getGaussianKernel(kernel_size, sigma, cv2.CV_64F)
print(kernel)

gaussian_first_deriv_x = np.zeros_like(kernel)
assert(kernel_size % 2 == 1) # I assume you are using an odd kernel_size
half_kernel_size = int(kernel_size / 2)
for i in range(kernel_size):
    x = - half_kernel_size + i
    factor = - x/ (sigma**2)
    gaussian_first_deriv_x[i] = kernel[i] * factor

print(gaussian_first_deriv_x)

plt.plot(kernel[:], 'b')
plt.plot(gaussian_first_deriv_x[:], 'r')
plt.show()

现在,您可以使用此内核进行卷积。

注意:如果您使用的是 Python,您也可以使用来自 from scipy import ndimage 的函数 ndimage.gaussian_filter1d(data, sigma=1, order=1, mode='wrap')

OpenCV 默认使用如下:sigma = 0.3 * (kernel_size / 2.0 - 1) + 0.8

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多