【问题标题】:Approximate image from byte array来自字节数组的近似图像
【发布时间】:2018-11-11 18:56:25
【问题描述】:

我写了一个应用程序,其中一些点是浮动的,如果我为一个点分配一个点,它会在这个位置上移动。现在我想加载一个图像,将其转换为单色图像(只有纯黑色或白色像素 - 没有灰色阴影)并使每个点浮动到它代表黑色像素的位置。 我已经以这种方式加载和转换图像并将像素提取为一维字节[]。我已经设法使用以下代码迭代了这个数组:

int stride = width * 4;
for (int y = 0; y < height; y++)
    for (int x = 0; x < width; x++)
    {
        int index = y * stride + 4 * x;
        // array[index] <- Red
        // array[index + 1] <- Green
        // array[index + 2] <- Blue
        // array[index + 3] <- Alpha
    }

字节数组包含 4 个字节 (RGBA) 的每个像素。所以数组长度是 ImageHeight*ImageWidth*4 字节。像素是黑色 (0, 0, 0, 255) 或白色 (255, 255, 255, 255)。

我现在的问题是我无法仅用 n 个点来正确近似图像的黑色区域。在大多数情况下,我的浮动点要比阵列中的黑色像素少得多。所以我需要的是一种方法,它可以给我一个 Point[],其中包含 n 个 Points,这些点将尽可能好地表示图像的黑色区域。有人可以帮帮我吗?

【问题讨论】:

标签: c# arrays image


【解决方案1】:

遍历数组并找到它们的红色、绿色和蓝色为 0 的点 获得黑点:

List<Point> blackPoints = new List<Points>()
for(int i=0; i<array.Length; i+=4)
    if(array[i] == 0 && array[i+1] == 0 && array[i+2] ==0) //alpha is not important
    {     
         int tmp = i / 4;
         blackPoints.Add(new Point(tmp%width, tmp/width));
    }

创建方法,根据像素自身和相邻的颜色来获取像素的权重,还有一个方法来查找块的权重:

public static class Exts
{
    public static int Weight(this points ps, int x, int y, int width, int height)
    {
         int weight = 0;
        for(int i=Math.Max(x - 1, 0); i<Math.Min(width, x+1))
            for(int j= Math.Max(y-1, 0), j<Math.Min(height, y+1))
                 if(ps.Any(a => a.X == i && a.Y == j)) weight++;
        return weight;
    }

    public static int BlockWeight(this Point[] ps, int x, int y)
    {
        return ps.Count(a => a.X <= x+2 && a.Y<= y+2);
    }   
}

现在循环遍历位图,使用 9 个像素 (3x3) 的块,如果块重量超过一半(在本例中大于或等于 5),请选择此块中重量最高的点,表示黑点:

List<Point> result = new List<Point>();

for(int i=0; i<width; i+=3)
    for(int j=0; j< height; j+=3)
        if(points.BlockWeight(i,j) >= 5)
            result.Add(ps.Where(a => a.X <= x+2 && a.Y<= y+2).OrderByDescending(a => a.Weight(i, j, width, height)).First())

【讨论】:

  • 是的,正如我所说的,我可以遍历数组,但我如何获得尽可能好的描述黑色区域的 n 个像素的坐标?假设图像是 300x300 像素。 300*300 为 90,000 像素。如果有 30,000 个黑色像素,但我只有 3000 个点来表示它们……我应该选择这 30,000 个黑色像素中的哪一个来显示带有我的点的图像?我不能只取每 10 个,因为这会产生垂直笔划。我必须跳过一些行和一些列......但我不知道该怎么做:(
  • 这是图像处理,你计算一个点的权重(基于它的邻居(基于它的黑点的数量)它的权重较高的点就是那个。我会更新如果你需要帮助,我会回答你。你呢?
  • 这听起来很有趣 :) 你能再解释一下吗?非常感谢:)
  • 应该是10,还是可以是9(3*3)?
  • 10 是什么意思? blackPixels / n_dots 的比率?我希望这无关紧要……是吗?
猜你喜欢
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
相关资源
最近更新 更多