我有一个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) - 这个感觉像绿色是无关紧要的。洋红色非常接近,并且处于类似的角度。
在我开始编码之前,我想知道是否已经有一个很好的算法来做这种事情。任何想法将不胜感激!
谢谢你的时间...
感谢Nico的回复。我有一个有效的解决方案,虽然我不知道这是否是最好的。但如果有人遇到这个,这就是我做的。
(这些数组可能对我正在使用的框架是唯一的,但你可以提出一般性的想法。)
它没有为颜色的影响设置任何界限,但是当我从颜色点移开时,通过减少颜色的影响我可以获得良好的结果。
//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
}