是否存在使用仅基于少量起始值的数据填充2D矩阵的算法?

问题描述 投票:0回答:1

我有一个2D网格,以及网格内的一系列点。 (为了便于讨论,让我们将它们视为位图中的颜色。)

我有一定数量的真实像素我知道颜色,其余的位图是空白的。

Here's an example with 5 points

对于位图中的任何给定像素,我想根据其与真实像素的接近程度(我知道颜色)对其进行着色。

This is roughly what it should look like when complete

我发现很难弄清楚每个真实像素应该能够影响的区域。以下是一些案例:

Case (A) - 感觉它想要使用它周围的4种颜色。直觉是4可能是它需要使用的最多颜色?也许我可以在像素周围的每个象限中找到最近的真实像素?

Case (B) - 感觉它只能使用3种颜色,因为它靠近边缘。它不想要黄色。蓝色和红色都在左下象限,所以我不能只获得最接近的真实像素。蓝色比绿色更接近,使用它似乎是正确的。也许蓝色和红色都是相关的,因为它们相隔一定角度?

Case (C) - 这个感觉像绿色是无关紧要的。洋红色非常接近,并且处于类似的角度。

在我开始编码之前,我想知道是否已经有一个很好的算法来做这种事情。任何想法将不胜感激!

谢谢你的时间...

algorithm matrix 2d
1个回答
0
投票

感谢Nico的回复。我有一个有效的解决方案,虽然我不知道这是否是最好的。但如果有人遇到这个,这就是我做的。

(这些数组可能对我正在使用的框架是唯一的,但你可以提出一般性的想法。)

Here is my result

它没有为颜色的影响设置任何界限,但是当我从颜色点移开时,通过减少颜色的影响我可以获得良好的结果。

//c++

void buildMatrix(){

    matrix.clear();

    // for each pixel
    for (int x = 0; x < 128; ++x){
        for (int y = 0; y < 128; ++y){

            auto matrix_point = new MatrixPoint(x,y);

            // for each point where I know the colour, find out how far it is from this point
            for (int colour_index = 0; colour_index < colours.size(); ++colour_index)
            {
                int x2 = colours[colour_index].x;
                int y2 = colours[colour_index].y;

                auto distance = getColourAmount(x, y,x2,y2);

                matrix_point->distance_index.add(colour_index, distance});

                if (x == x2 && y == y2)
                {
                    // found a solid colour, no need to add any more colours to this point
                    break;
                }
            }

            // scale the results so they add up to 1
            float total_percentage = 0.0f;

            for (int i = 0; i < matrix_point->distance_index.size(); ++i)
            {
                float this_percentage = matrix_point->distance_index[i].percent;
                total_percentage += this_percentage;
            }

            // scale percentages so that they add up to 1
            for (auto &item : matrix_point->distance_index)
            {
                item.setY(item.getY() / total_percentage);
            }

            matrix.add(*matrix_point);
        }
    }
}

float getColourAmount(int x1, int y1, int x2, int y2)
{
    float deltaX = x1 - x2;
    float deltaY = y1 - y2;
    float max_distance = sqrtf(128 * 128 + 128 * 128);
    auto output = (max_distance - sqrtf((deltaX * deltaX) + (deltaY * deltaY))) / max_distance;
    return pow(output,10); // scale down the result 
}
© www.soinside.com 2019 - 2024. All rights reserved.