计算二维数组中的平均跨区域

Kon*_*tov 3 python opencv numpy scipy

简而言之:我需要一个快速(预编译)函数,比如来自 OpenCV 的filter2d双类型输出。不是整数

详细信息: 我有一个 numpy 数组,它存储来自 OpenCV 的单色图像。

我需要像这样计算一些正方形(例如)内核的矩阵的平均值:

kernel size = (3,3)
Run Code Online (Sandbox Code Playgroud)

输入数组:

[[13 10 10 10]
 [12 10 10  8]
 [ 9  9  9  9]
 [ 9 10 10  9]]
Run Code Online (Sandbox Code Playgroud)

输出数组:

[[ 10.22222222   9.44444444]
 [  9.77777778   9.33333333]]
Run Code Online (Sandbox Code Playgroud)

例如:10.22222 = (13+10+10+12+10+10+9+9+9)/9

我写这个函数:

def smooth_filt(src,area_x,area_y):
    y,x = src.shape
    x_lim = int(area_x/2)
    y_lim = int(area_y/2)
    result = np.zeros((y-2*y_lim,x-2*x_lim), dtype=np.float64)

    for x_i in range(x_lim,x-x_lim):
        for y_i in range(y_lim,y-y_lim):
            result[y_i-y_lim, x_i-x_lim] = np.mean(src[y_i-y_lim:y_i+area_y-y_lim,x_i-x_lim:x_i+area_x-x_lim])
    return result
Run Code Online (Sandbox Code Playgroud)

但这还不够快。

请告诉我是否有更快的方法来计算这个。

答: 我检查了所有方法。可以看到代码:http : //pastebin.com/y5dEVbzX

并确定模糊是最强大的方法,它几乎与内核大小无关。

用不同方法处理一幅图像的图形。测试集是 298 张图像。 在此处输入图片说明

Han*_*rén 5

以块为单位计算平均值只是将图像与恒定内核进行卷积。您可以scipy.signal.convolve2d为此使用:

from scipy.signal import convolve2d
kernel = np.ones((3,3)) / 9.
out = convolve2d(img, kernel, mode='valid')
Run Code Online (Sandbox Code Playgroud)

mode='valid'参数仅用于获取您感兴趣的结果部分。