Python 将图像分割为重叠面片的有效方法,对面片进行数学运算,然后通过在每个像素处取最大值将图像合并到一起

Python 将图像分割为重叠面片的有效方法,对面片进行数学运算,然后通过在每个像素处取最大值将图像合并到一起,python,numpy,computer-vision,Python,Numpy,Computer Vision,基本上,我只是试着按照tital所说的去做,我有一个工作功能,但它的运行速度太慢了。此函数的输入图像将始终具有相同的形状和尺寸(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

基本上,我只是试着按照tital所说的去做,我有一个工作功能,但它的运行速度太慢了。此函数的输入图像将始终具有相同的形状和尺寸(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

您可以使用
view\u as\u windows
,它使用引擎盖下的步幅来平铺图像并在平铺上计算。请注意,这会创建一个视图,任何更改视图内容的计算尝试都应谨慎进行。在这里,if语句的计算是顺序的,必须谨慎处理(甚至是顺序处理)。就std和中值而言,您可以使用:

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))

您可以使用
view\u as\u windows
,它使用引擎盖下的步幅来平铺图像并在平铺上计算。请注意,这会创建一个视图,任何更改视图内容的计算尝试都应谨慎进行。在这里,if语句的计算是顺序的,必须谨慎处理(甚至是顺序处理)。就std和中值而言,您可以使用:

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))