像Theano的conv2d那样的子抽样的Scipy卷积2d?

2024-09-25 00:32:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望使用10 X 10滤波器对尺寸为600 X 400的图像执行二维卷积。过滤器不可分离。scipy.signal.convolve2d目前对我来说效果不错,但我期待不久会有更大的图片。在

对此,我有两个想法

  1. 调整图像大小
  2. 二次抽样(或跨步)?在

专注于子采样部分,theano有一个函数,它的卷积方式与scipy卷积2d相同,参见theano conv2d

它也有子采样选项。但是,在windows上安装no让我很痛苦。如何使用scipy.signal.convolve2d获得子采样工作?还有其他的选择吗(这不需要我安装一些重量级的库)?在


Tags: 函数图像过滤器signal尺寸选项方式图片
1条回答
网友
1楼 · 发布于 2024-09-25 00:32:05

你可以手工实现子采样,为了简单起见,我只画1d。假设你想在一个间隔为k的规则子网格上采样s=d*f。那么你的第n个样本是s_nk=sum_i=0^10 f_i d_nk-i。这里要观察的是f和d的指数总和总是k的倍数。这意味着把它分成子和s_nk=sum_j=0^k-1 sum_i=0^10/k f_j+ik d_j+(n-i)k。所以你需要做的是:子样本d在所有偏移量为0,…,k-1处的间距为k的网格处。将所有结果对的偏移量和子采样数相加。在

下面是一些1d的代码,它大致实现了上面的功能,只是网格的位置稍有不同,以便于索引管理。第二个函数用愚蠢的方法来做,即先计算完整的卷积,然后再进行除法运算。它是用来测试第一个函数的。在

import numpy as np
from scipy import signal

def ss_conv(d1, d2, decimate):
    n = (len(d1) + len(d2) - 1) // decimate
    out = np.zeros((n,))
    for i in range(decimate):
        d1d = d1[i::decimate]
        d2d = d2[decimate-i-1::decimate]
        cv = signal.convolve(d1d, d2d, 'full')
        out[:len(cv)] += cv
    return out

def conv_ss(d1, d2, decimate):
    return signal.convolve(d1, d2, 'full')[decimate-1::decimate]

编辑:2d版本:

^{pr2}$

相关问题 更多 >