- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
对于图像分割,我使用 OpenCV 的 GaussianBlur
差分高斯特征(范围从 0.8 到 8.43,指数步长为 1.4)。我的图像大小为 4096 x 2160,所以这需要相当长的时间(在一个核心上 8 秒,这在处理视频时相当长)。
你能给我一些关于如何加快速度的建议吗?目前我正在尝试在 FFT 中实现高斯滤波。到目前为止,我有以下代码:
ftimage = np.fft.fft2(image)
ftimage = np.fft.fftshift(ftimage)
kernel = cv2.getGaussianKernel(11, 3)
kernel = kernel * kernel.T
ftkernel = np.fft.fftshift(np.fft.fft2(kernel, (h, w)))
ftimagep = ftimage * gmask
imagep = np.fft.ifft2(ftimagep)
imageq = cv2.GaussianBlur(image, (11,11), 3))
这里的问题是 imagep
和 imageq
是彼此的移位版本。其次,由于高斯函数的傅里叶函数也是高斯函数,我该如何直接计算 ftkernel
?
下面的答案:我已经实现了近似过滤:
def approx_g(image, sigma_g, n=5):
w = np.sqrt(12*sigma_g**2/n + 1)
wu = np.ceil(w) if np.ceil(w) % 2 == 1 else np.ceil(w)+1
wl = np.floor(w) if np.floor(w) % 2 == 1 else np.floor(w)-1
if w == w//1:
wl -= 2
wu += 2
m = round((12*sigma_g**2 - n*wl**2 - 4*n*wl - 3*n) / (-4*wl - 4))
wl = int(wl)
wu = int(wu)
for num in range(0,int(m)):
image = cv2.blur(image, (wl, wl))
for num in range(0,int(n-m)):
image = cv2.blur(image, (wu, wu))
return image
对于 n=4,L2 像素差异看起来相当不错:
我还对不同的 sigma 进行了速度比较:
最佳答案
高斯滤波器可以通过级联的框(平均)滤波器来近似,如 Fast Almost-Gaussian Filtering 的第二部分所述。 .此方法需要使用 Integral Image ,并允许更快地应用(接近)高斯滤波,特别是对于高模糊情况。
让过滤器半径为问题中的 8.43。
sigma_g = 8.43
盒式过滤器的连续应用次数决定了近似程度。对于这个例子,我将它设置为 5:
n = 5
首先,使用等式 3 找到盒式过滤器的理想宽度:
w = np.sqrt(12*sigma_g**2/n + 1)
如论文中所述,使用两个不同大小的盒式过滤器效果更好。为了对称,滤波器的长度必须为奇数,长度相差 2。下面的代码采用 w 并找到最接近的奇数整数。 (它可能会写得更好):
wu = np.ceil(w) if np.ceil(w) % 2 == 1 else np.ceil(w)+1
wl = np.floor(w) if np.floor(w) % 2 == 1 else np.floor(w)-1
if w == w//1:
wl -= 2
wu += 2
如果需要 n 个连续的应用程序,则使用宽度为 wu 的第一个过滤器执行 m,并使用宽度为 wl 的第二个过滤器执行 (n-m)。公式 5 显示了如何计算 m:
m = round((12*sigma_g**2 - n*wl**2 - 4*n*wl - 3*n) / (-4*wl - 4))
接下来,计算水平和垂直积分图像的函数:
def integral_image_1d_hor(image):
''' Calculated the 1d horizontal integral
image of an image.'''
n1, n2 = np.shape(image)
int_im = np.zeros((n1, n2))
for row in range(0,n1):
int_im[row,0] = image[row,0]
for row in range(0,n1):
for col in range(1,n2):
int_im[row,col] = image[row,col] + int_im[row,col-1]
return int_im
def integral_image_1d_ver(image):
''' Calculated the 1d vertical integral
image of an image.'''
n1, n2 = np.shape(image)
int_im = np.zeros((n1, n2))
for col in range(0,n2):
int_im[0,col] = image[0,col]
for col in range(0,n2):
for row in range(1,n1):
int_im[row,col] = image[row,col] + int_im[row-1,col]
return int_im
要使用积分图像进行过滤,我有这些函数:
def box_1d_filter_hor(int_im_1d, width):
w = int((width-1)/2)
fil_im = np.zeros(np.shape(int_im_1d))
pad = w
int_im_1d = np.pad(int_im_1d, pad, 'constant')
n1 = np.shape(int_im_1d)[0]
n2 = np.shape(int_im_1d)[1]
for row in range(pad, n1-pad):
for col in range(pad, n2-pad):
fil_im[row-pad,col-pad] = (int_im_1d[row,col+w]
- int_im_1d[row,col-w-1])/width
return fil_im
def box_1d_filter_ver(int_im_1d, width):
w = int((width-1)/2)
fil_im = np.zeros(np.shape(int_im_1d))
pad = w
int_im_1d = np.pad(int_im_1d, pad, 'constant')
n1 = np.shape(int_im_1d)[0]
n2 = np.shape(int_im_1d)[1]
for col in range(pad, n2-pad):
for row in range(pad, n1-pad):
fil_im[row-pad,col-pad] = (int_im_1d[row+w,col]
- int_im_1d[row-w-1,col])/width
return fil_im
然后我又定义了两个函数,用于在水平和垂直方向上处理图像:
def process_hor(image, w):
int_im = integral_image_1d_hor(image)
fil_im = box_1d_filter_hor(int_im, w)
return fil_im
def process_ver(image, w):
int_im = integral_image_1d_ver(image)
fil_im2 = box_1d_filter_ver(int_im, w)
return fil_im2
最后,使用所有这些先前的函数,使用以下函数来近似高斯滤波:
def approximate_gaussian(image, wl, wu, m, n):
for num in range(0,int(m)):
image = process_hor(image, wl)
image = process_ver(image, wl)
for num in range(0,int(n-m)):
image = process_hor(image, wu)
image = process_ver(image, wu)
return image
我并没有真正处理图像的边缘,但是可以通过修改上面的函数来调整。这应该更快,特别是对于高斯模糊半径非常高的情况。
关于python - 使用 FFT 的高斯图像滤波,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42560434/
编写求解线性代数方程组的高斯-乔丹方法的任务是我选择用来推进学习 J 的一项练习。系统为 Ax=b,其中 A 是 n-by-n 矩阵,b 和未知的 x 是 n-向量。首先,我从带有控制结构的最简单形式
祝大家新年快乐! :) 我正在 Matlab 中编写 Gauss-Seidel 函数,但遇到了一些问题。 当精度达到 6 位小数时,迭代必须停止。这意味着x-xprevious的无限范数(要求使用它)
我正在尝试使用 scipy 和曲线拟合对我的数据进行高斯拟合,这是我的代码: import csv import numpy as np import matplotlib.pyplot as plt
[已解决,谢谢] 我在 C++ 中开发了下面的代码来使用高斯-塞德尔方法求解线性方程,但我似乎在填充数组时在运行时遇到了一个我无法弄清楚的问题。这是我的代码... #include int main(
我必须设计一种算法作为正向消元法的扩展,在矩阵上进行高斯约旦消元法。我的程序正在执行并创建数字的对角线,但它们并不都是 1。它也不会访问第一行和第一列以将它们更改为 0。最后一列,也就是答案所在的那一
我已经按照 Nixon Aguado 的算法实现了一个高斯滤波器。算法(找到此处描述的模板后 gaussian template )如下。 我相信伪代码是 MATLAB 风格的。 function c
在平滑图像时,我应该应用高斯和双边滤波器等哪种颜色空间版本(灰度、RGB、HSV 等)以获得最佳的去噪效果?是有一个总体趋势,还是在不同情况下会发生变化? 此外,您建议在图像处理中使用什么滤镜和色彩空
我需要根据 Java 中的正态分布对网格(MXN 矩阵)的单元格进行采样。 我知道the Apache Math library具有对一维(1D)值进行采样的函数,因此对于 vector 来说很好,但
我可以使用 random.gauss(mu, sigma) 函数生成高斯数据,但是如何生成二维高斯数据?有这样的功能吗? 最佳答案 如果你可以使用numpy,有numpy.random.multiva
为什么要使用滤波 消除图像中的噪声成分叫作图像的平滑化或滤波操作。信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没。因此一个能降低高频成分幅度的
我正在执行高斯混合模型分类,并基于此,在 MATLAB 中使用“mvnpdf”函数。 据我所知,该函数返回传递给它的数据点或元素的多变量概率密度。 但是我试图在 C 上重新创建它,并且我假设 mvnp
I am using rbf,Support Vector machine for large training set=1135x9 matrix and test set{95x9}. I am
我现在多次偶然发现使用 scipy.curve_fit 在 python 中进行拟合比使用其他工具(例如根 ( https://root.cern.ch/ ) 例如,在拟合高斯分布时,使用 scipy
我想在 MATLAB 中绘制高斯波函数的二维表示。我希望 2D 图为一种颜色(绿色),远离高斯中心变得透明。 当我使用 imagesc 时(就像在下一个代码中一样),我在黑色方 block 上得到了一
如果我有数据(每日股票图表是一个很好的例子,但它可以是任何东西),其中我只知道 X 单位销售的范围(高 - 低)但我不知道确切的价格出售的任何给定元素。为简单起见,假设价格范围包含足够的桶(例如,40
这个问题在这里已经有了答案: Impulse, gaussian and salt and pepper noise with OpenCV (10 个回答) 关闭6年前。 我想知道 Python 中
我是一名优秀的程序员,十分优秀!