首页 > 解决方案 > 将图像拆分为重叠补丁的有效方法,对补丁进行数学运算,然后通过获取每个像素的最大值将图像重新合并在一起

问题描述

基本上试图按照蒂塔尔所说的去做,我有一个工作功能,但它的运行速度很慢。此函数的输入图像将始终具有相同的形状和尺寸 (2d)。

这是我的工作但速度慢的代码

def z_score_detect():
    data = currentData - bkgData
    tileY =12
    tileX =12
    h,w = data.shape

    DETECTED = np.zeros(data.shape).astype(np.float32)
    for curY in range(tileY//2, h-tileY//2,tileY//2):
        for curX in range(tileX//2, w-tileX//2,tileX//2):
            # Get one of the patches of data
            S = data[curY-tileY//2:curY+tileY//2,curX-tileX//2:curX+tileX//2]
            # comput stdev, median
            rms_bot_75 = rms(np.sort(S,axis=None)[:int((tileX*tileY)*.75)])
            std_dev = np.std(S)
            if std_dev != 0:
                # IF SIGMA NOT ZERO
                S = (S-rms_bot_75)/std_dev
                # Done with processing this patch so update our output image
            else:
                continue
            DETECTED[curY-tileY//2:curY+tileY//2,curX-tileX//2:curX+tileX//2] = np.maximum(S,DETECTED[curY-tileY//2:curY+tileY//2,curX-tileX//2:curX+tileX//2])
                        
    return DETECTED

标签: pythonnumpycomputer-vision

解决方案


您可以使用view_as_windowswhich 在引擎盖下使用 strides 来平铺您的图像并在平铺上进行计算。请注意,这会创建一个视图,并且应谨慎进行任何更改其内容的计算尝试。在这里,您的 if 语句计算是顺序的,必须谨慎处理(甚至顺序)。就标准和中位数而言,您可以使用:

from skimage.util import view_as_windows
#this tiles your image into shape (tileX,tileY) overlapping tiles
tiles = view_as_windows(data, (tileX,tileY))
#std and median of each tile
std_dev = tiles.std(axis=(-2,-1))
median = np.median(tiles, axis=(-2,-1))

推荐阅读