1

菜鸟在这里。

我有一个(某种)二进制图像,其中包含已知数量的形状和大小不同的斑点。每个 blob 中的像素值相当于 blob 索引。我想只处理(使用时刻)最大的 5 个 blob。

目前,我正在遍历每个连接的像素,并增加一个变量以获取每个 blob 的区域(请参见下面的代码)。然后,我只根据需要处理最大的 blob,但是这种像素迭代方法在 python 中非常慢。

 for i in range(1, objectCount):
            zm=0.0
            for h in range(im.height):
                for w in range(im.width):
                    pixVal = cv.Get2D(im, h, w)
                    if (pixVal[0] == i):
                        zm=zm+1
            objectArea.append([int(zm)])

有没有更快的方法来做到这一点?

4

2 回答 2

2

这是替换上面的代码:

hist = cv.CreateHist([255], cv.CV_HIST_ARRAY, [[0,255]], 1)
cv.CalcHist([im] , hist)          
for h in range(255):
    zm = cv.QueryHistValue_1D(hist, h)
    objectArea.append([int(zm)])
于 2012-10-04T10:32:56.687 回答
1

由于您的像素值对应于 blob id,因此您可以计算图像的直方图并仅选择 5 个最高列以避免所有这些像素迭代。

要计算直方图,您可以使用 OpenCV 的calcHist方法。

是一个使用示例。

于 2012-10-03T12:31:51.107 回答