在Python中优化输入图像生成窗口特征

时间:2014-02-11 11:25:01

标签: python image-processing window feature-extraction

我在Python中创建了一个脚本,它将图像作为输入并生成一个新图像,其中每个像素对应于从输入图像中的窗口像素组计算的特征。以下图片将突出这一想法:

enter image description here

在边框情况下,我们可以将NaN插入输出图像,或者只使用窗口内可用的像素。在Python或其他一些编程语言中实现此功能的优化方法是什么?目前,我的脚本只是使用一堆for - 循环来完成工作。在这里你可以看到代码:

# This function will return the statistical features
# 
#
# INPUTS: 
# 'data' the data from which statistical features are to be calculated
# "winSize" specifying the window size, must be odd and > 1
#
# OUTPUT: 
# 'meanData, stdData' statistical feature matrices (numpy ndarrays)

def get_stat_feats(data, winSize):

    rows = data.shape[0]
    cols = data.shape[1]
    dist = int(math.floor(float(winSize)/2.0))
    neigh = range(-dist, dist+1)
    temp = np.zeros((int(winSize)**2, 1))
    meanData = np.zeros(data.shape)
    stdData = np.zeros(data.shape)
    for row in range(0, rows):
        for col in range(0, cols):
            index = 0
            makeNaN = 0
            for y in neigh:
                for x in neigh: 
                    indY = row + y
                    indX = col + x
                    # Check that we are inside the image
                    if indY >= 0 and indY <= rows-1 and indX >= 0 and indX <= cols-1:
                        temp[index] = data[indY, indX]
                        index += 1
                    else: 
                        makeNaN = 1
            if makeNaN == 1:
                meanData[row, col] = np.NAN
                stdData[row, col] = np.NAN

            else:
                meanData[row, col] = np.mean(temp)
                stdData[row, col] = np.std(temp)       
    return meanData, stdData

Thnx任何帮助! =)如果需要更多信息,请询问=)

1 个答案:

答案 0 :(得分:2)

来自scipy.ndimage的

generic_filter应该是一个不错的解决方案。可能更快的解决方案,但这是我认为最简单的。

可以使用mode参数来定义如何处理边缘。例如,您可以将其设置为将边框外的元素处理为常量和相等的NaN,如下所示:

generic_filter(a, f, size=winSize, mode='constant', cval=np.nan)

def get_stat_feats(data, winSize):
    from scipy.ndimage import generic_filter
    import numpy as np
    mean = lambda x: x.mean()
    std = lambda x: x.std()

    meanData = generic_filter(data, mean, size=winSize)
    stdData = generic_filter(data, std, size=winSize)

    return meanData, stdData

强制浮动和舍入返回值:

import numpy as np

def get_stat_feats(data, winSize):
    from scipy.ndimage import generic_filter
    import numpy as np
    data = data.astype(float)
    mean = lambda x: x.mean()
    std = lambda x: x.std()

    meanData = generic_filter(data, mean, size=winSize)
    stdData = generic_filter(data, std, size=winSize)

    return np.round(meanData,2), np.round(stdData, 2)