1

所以我有这段代码

for x in range(x1,x2):
        for y in range(y1, y2):
            cpixel = pixels[x, y]
            if bw:
                bw_value = int(round(sum(cpixel) / float(len(cpixel))))
                all_pixels.append(bw_value)
                title = "Averaged (B&W) Pixel Values"
            else:
                if lumi:
                    luma = (0.3 * cpixel[0]) + (0.59 * cpixel[1]) + (0.11 * cpixel[2])
                    all_pixels.append(luma)
                    title = "Pixel Luminosity Values"
                else:
                    if round(sum(cpixel)) / float(len(cpixel)) > 100:
                        all_pixels.append(255)
                    else:
                        all_pixels.append(0)
                    title = "Pixel Binary Transform Values"

从这里获取并修改了一点从PIL 获取像素值列表,以给出边界区域(用户选择)内的像素值列表(all_pixels)。

在记录了一系列相似的值后,我试图找出一种有效的方法来检测列表中的变化。由于该列表似乎从上到下和从左到右列出了像素值。在我将使用它的场景中,它会有一个相似值的列表,直到它到达图像的一个区域,然后值将开始来回切换,直到值再次稳定在一个新值附近。

我感兴趣的是跟踪这两者之间的边界,我想检测这个边界在哪里以及它是向左还是向右移动。除了必须检查每个值附加到 all_pixels 时,我真的想不出任何其他方法,然后只追溯坐标。

但即使这看起来也相当粗略,因为即使我在下一个显着不同的值被视为显着变化(而不仅仅是异常值)之前将任意数量的值设置为相同,之后值开始在旧值之间切换和新的。

我想理想情况下,我需要为此边界区域/线的坐标生成某种最佳拟合线。我只需要一些想法如何解决这个问题。

4

2 回答 2

1

根据您评论中对问题的描述,我认为一个简单的边缘检测器可能就足够了,尽管这取决于相机角度、对比度、照明等。

您可以获取图像的垂直导数,可能会稍微平滑一点并找到具有最高值的行。假设图像在圆柱体上放大,除了粉末边界之外没有其他主要的垂直对比,那应该是粉末的高度。

您可以自己编写代码,或使用 OpenCV,但我认为这对于这项任务来说可能有点过于强大。Numpy 也是一个不错的选择。

于 2012-06-14T02:59:37.690 回答
0

根据您的描述,听起来您真的应该只使用计算机视觉库,而不是尝试编写自己的图像检测代码。

下面是关于 Python 中计算机视觉的讨论: 什么是 Python 的好的计算机视觉库,可以让我在 Flash/HTML5 视频中找到面孔?

听起来 OpenCV 是最好的选择。

http://opencv.willowgarage.com/

于 2012-06-14T02:49:58.747 回答