【问题标题】:How can I check if there is a black pixel in between two pixels of interest in Python?如何检查 Python 中两个感兴趣的像素之间是否有黑色像素?
【发布时间】:2021-06-13 05:47:11
【问题描述】:

我有一张白色背景和黑色像素代表墙壁或边界的图像。我想知道图像上两点之间是否有边界。

我的方法是在两个兴趣点之间的线上找到所有整数点,并检查这些点是否是黑色像素。这是我绘制它时的样子(蓝色圆圈表示两个兴趣点,红点是通过线的所有点):

如您所见,黑线似乎没有通过位于兴趣点之间的线上的整数点之一。如何判断黑线是否穿过两点之间的线。

PS:我需要检查大量点对,并且图像有很多边界,因此高效的算法会有所帮助。

【问题讨论】:

  • 您可以用另一种颜色(例如蓝色)进行泛光填充,从任一感兴趣点开始使用不能穿过黑色的泛光填充。然后检查其他兴趣点是否触及任何蓝色邻居。
  • 或者求解两条线的交点,看是否落在对角为两条线端点的矩形内。

标签: python-3.x matplotlib image-processing


【解决方案1】:

您正在寻找超级覆盖算法。具体代码见this link

这是一个用 javascript 编写的解决方案:

function supercover_line(p0, p1) {
    let dx = p1.x-p0.x, dy = p1.y-p0.y;
    let nx = Math.abs(dx), ny = Math.abs(dy);
    let sign_x = dx > 0? 1 : -1, sign_y = dy > 0? 1 : -1;

    let p = new Point(p0.x, p0.y);
    let points = [new Point(p.x, p.y)];
    for (let ix = 0, iy = 0; ix < nx || iy < ny;) {
        let decision = (1 + 2*ix) * ny - (1 + 2*iy) * nx;
        if (decision === 0) {
            // next step is diagonal
            p.x += sign_x;
            p.y += sign_y;
            ix++;
            iy++;
       } else if (decision < 0) {
            // next step is horizontal
            p.x += sign_x;
            ix++;
        } else {
            // next step is vertical
            p.y += sign_y;
            iy++;
        }
        points.push(new Point(p.x, p.y));
    }
    return points;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    相关资源
    最近更新 更多