基于GDAL的Python最小距离算法

2024-10-01 15:30:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用GDAL和Python实现图像分类的最小距离算法。在计算了样本区域的平均像素值并将它们存储到数组列表(“sample_array”)之后,我将图像读入名为“values”的数组中。使用以下代码,我循环遍历此数组:

values = valBD.ReadAsArray()

# loop through pixel columns
for X in range(0,XSize):

    # loop thorugh pixel lines
    for Y in range (0, YSize):

        # initialize variables
        minDist = 9999
        # get minimum distance
        for iSample in range (0, sample_count):
            # dist = calc_distance(values[jPixel, iPixel], sample_array[iSample])

            # computing minimum distance
            iPixelVal = values[Y, X]
            mean = sample_array[iSample]
            dist = math.sqrt((iPixelVal - mean) * (iPixelVal - mean)) # only for testing

            if dist < minDist:
                minDist = dist
                values[Y, X] = iSample

classBD.WriteArray(values, xoff=0, yoff=0)

对于大图像,此过程需要很长时间。所以我想问问有没有人知道更快的方法。我不太了解python中不同变量的访问速度。或者有人知道我可以用的图书馆。 提前谢谢你, 马里奥


Tags: samplein图像loopfordistrange数组
2条回答

同意thomask的观点:使用PIL,或者编写一个C函数并使用ctypes包装它,或者至少使用一些numPy matrix operations。 或者在现有代码上使用pypy(JIT编译的代码在图像代码上可以快100倍)。试试pypy告诉我们你有多快。在

底线:永远不要在cPython中原生地做像素级的事情,解释和内存管理开销会让你丧命。在

你肯定应该用NumPy。我处理一些相当大的光栅数据集,NumPy会在其中烧掉它们。在我的机器上,使用下面的代码,对于1000 x 1000数组没有明显的延迟。代码后面有一个对如何工作的解释。在

import numpy as np
from scipy.spatial.distance import cdist

# some starter data
dim = (1000,1000)
values = np.random.randint(0, 10, dim)

# cdist will want 'samples' as a 2-d array
samples = np.array([1, 2, 3]).reshape(-1, 1)

# this could be a one-liner
# 'values' must have the same number of columns as 'samples'
mins = cdist(values.reshape(-1, 1), samples)
outvalues = mins.argmin(axis=1).reshape(dim)

cdist()计算从values中的每个元素到samples中每个元素的“距离”。这将生成一个1000000x3数组,其中每一行n具有从原始数组中的像素n到每个样本值[1, 2, 3]的距离。argmin(axis=1)给出了每行的最小值的索引,这是您想要的。一个快速的重塑会给你一个图像所期望的矩形格式。在

相关问题 更多 >

    热门问题