如何在二进制地图中近似这些模糊的矩形形状?

信息处理 图像分割
2022-02-12 17:18:23

以下二进制地图是我进行的测量的结果。我正在寻找红色区域的可量化度量。我可以手动跟踪矩形(右上角图像上的绿色矩形),但很难激发它们的形状。

是否有一种自然(且使用良好)的方法来检测这些矩形的形状?

在此处输入图像描述

我最初的想法是对所有列和所有行求和,然后通过一些阈值找到边缘。但我想要更多的想法,因为我的计划感觉很临时。

1个回答

你可能会在Math Stack Exchange上得到更好的答案,但让我试一试。

首先,您应该尝试确定您希望矩形最大化的实际属性是什么。我会大胆猜测并说它可能是矩形内的红色像素数减去蓝色像素数

如果我的猜测是正确的(或者至少是一个很好的近似值),那么您可能想要做的第一件事就是整合您的数据也就是说, ,y)处的像素为红色,然后,对于每个点,您要计算f(x,y)1(x,y)1(x,y)

F(x,y)=i=0xj=0yf(i,j).

这很容易在两次遍历数据中计算出来,例如在伪代码中:

// first pass: integrate over x for each y
for y from 0 to y_max:
    sum = 0;
    for x from 0 to x_max:
        sum = sum + data[x,y];
        out[x,y] = sum;

// second pass: integrate over y for each x
for x from 0 to x_max:
    sum = 0;
    for y from 0 to y_max:
        sum = sum + out[x,y];
        out[x,y] = sum;

或者,实际上,即使只通过一次:

// do first row:
sum = 0;
for x from 0 to x_max:
    sum = sum + data[x,0];
    out[x,0] = sum;

// do other rows:
for y from 1 to y_max:
    sum = 0;
    for x from 0 to x_max:
        sum = sum + data[x,y];
        out[x,y] = sum + out[x,y-1];

(细心的读者还会注意到,这两个代码示例都可以通过替换所有实例来就地工作outdata

现在,如果您的矩形的一个角固定在,那么您需要做的就是找到最佳位置的最大值。(这可以通过遍历所有点并跟踪到目前为止看到的最大值及其位置来轻松有效地完成。)(0,0)F

但是,如果两个角都可以在任意位置,那么事情就会变得有点复杂。本质上,您想要最大化的是

G(x1,y1;x2,y2)=i=x1x2j=y1y2f(i,j)=F(x1,y1)F(x1,y2)F(x2,y1)+F(x2,y2)

其中后一个公式可以使用包含 - 排除原则导出。

不幸的是,虽然一维的类似问题相对容易解决,但在二维中它变得更加棘手。如果您没有太多的点,您可以遍历每一对可能的点并选择最大化的点,但是所花费的时间与点数的平方成比例(因此与数据分辨率)。G

相反,您最好利用集成数据的相对平滑度,首先进行采样以找到近似最大值,然后对其进行细化,或者只是通过更精细地采样近似最大值的附近,或者可能使用简单的爬山或者您可以尝试从每个低分辨率样本点开始一个简单的爬山过程,以找到附近的局部最大值,然后取这些最大值中的最大值。G

(您甚至可以考虑更高级的优化技术,例如模拟退火,但这些对于您的目的来说可能是多余的,甚至可能比上述更简单的方法效率低。)