如何用scipy.ndimage.correlate实现IDL convol()的完全重叠计算?
用scipy.ndimage.correlate复现IDL convol()的完全重叠计算
可行,但需要调整参数或对结果做针对性截取,具体说明如下:
核心差异
IDL的convol()默认仅保留核与输入完全重叠的计算结果(对应卷积领域的valid模式),输出尺寸为输入尺寸 - 核尺寸 + 1;而scipy.ndimage.correlate默认会对输入边缘做0填充(mode='constant'),输出尺寸与输入完全一致。
实现方法
手动截取完全重叠区域
先用默认参数运行correlate,再从结果中提取仅完全重叠的部分:
import numpy as np from scipy.ndimage import correlate input_arr = np.array([[1,2,3],[4,5,6],[7,8,9]]) kernel = np.array([[0,0,0],[0,1,0],[0,0,0]]) # 执行默认的correlate(边缘填充0) full_result = correlate(input_arr, kernel) # 计算完全重叠区域的尺寸 out_shape = (input_arr.shape[0] - kernel.shape[0] + 1, input_arr.shape[1] - kernel.shape[1] + 1) # 计算截取的起始索引(基于核中心位置) start_idx = ((kernel.shape[0]-1)//2, (kernel.shape[1]-1)//2) # 截取得到完全重叠区域的结果 valid_result = full_result[start_idx[0]:start_idx[0]+out_shape[0], start_idx[1]:start_idx[1]+out_shape[1]] print(valid_result) # 输出 [[5]],与IDL convol()的完全重叠计算结果一致
补充说明
你给出的示例中,scipy.ndimage.correlate输出的3x3矩阵是默认边缘填充0的结果,而IDL convol()在该场景下(输入与核尺寸相同)会输出单个元素5——这才是仅完全重叠位置的计算结果。如果需要和IDL的输出完全匹配,就需要按上述方法截取核心区域。
内容的提问来源于stack exchange,提问作者Arya Akmal
相关产品推荐
相关产品推荐

