Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将点列表从图片分割为连续块_C#_.net_Image Processing_System.drawing - Fatal编程技术网

C# 如何将点列表从图片分割为连续块

C# 如何将点列表从图片分割为连续块,c#,.net,image-processing,system.drawing,C#,.net,Image Processing,System.drawing,我有三百张照片。所有这些都是围绕一个对象制作的,但都是手动完成的,因此需要进行调整。一个物体应该在同一个位置,因为我要从这些照片制作timelapse视频。这个物体应该在同一个地方。照片之间的偏移量可能高达300-500px,所以太大了。我在那个主要物体上发现了一个红色标志,它存在于每张照片上,所以这是我的出发点 因此,我实现了小型.Net应用程序: 加载每个图像 扫描照片主区域中的像素 对于每个像素,它尝试将当前像素与所需像素进行比较。需要 像素保存为HSL编号。所有的照片都有点不同 亮度,所

我有三百张照片。所有这些都是围绕一个对象制作的,但都是手动完成的,因此需要进行调整。一个物体应该在同一个位置,因为我要从这些照片制作timelapse视频。这个物体应该在同一个地方。照片之间的偏移量可能高达300-500px,所以太大了。我在那个主要物体上发现了一个红色标志,它存在于每张照片上,所以这是我的出发点

因此,我实现了小型.Net应用程序:

  • 加载每个图像
  • 扫描照片主区域中的像素
  • 对于每个像素,它尝试将当前像素与所需像素进行比较。需要 像素保存为HSL编号。所有的照片都有点不同 亮度,所以它尝试搜索的不是特定的颜色,而是颜色的范围 与所需颜色相似的颜色。因此,对于每个H,S和L值,我都有可接受的增量
  • 它搜索满足颜色范围的像素的最小X和Y坐标
  • 然后我有主物体应该在的坐标
  • 然后,我在最小X和Y值和硬编码的中心坐标之间生成新的增量
  • 然后我用这些三角形将照片保存为新照片,这样所有照片上的红色标志都在同一个位置
  • 基本上,对于满足颜色范围的每个图像,我都有
    列表

    但我有一个问题-因为不同的亮度和较大的颜色范围,在一些照片上,它发现一些像素也满足所需的颜色范围。如果它们位于符号上方,则保存的增量不正确

    我怎样才能忽略这些假警报

    我目前的想法是用一些增量按位置分组像素。因此,附近的一组像素将被分组为一个块

    为此采取的步骤:

  • 我有带有所需颜色的
    点的列表。其中一些可能是虚警像素
  • 然后我用50px delta按它们之间的距离对它们进行分组
  • 如果附近有一些像素,那么我将它们作为一个块来计算
  • 然后我过滤所有小于40像素的块,这对于我的情况应该足够了。目前只有5-20个虚警像素
  • 筛选它们的当前代码:

    Dictionary<Rectangle, List<Point>> blocks = new Dictionary<Rectangle, List<Point>>();
    const int blockDelta = 50; // pixels delta
    foreach (var point in points
    {
        bool added = false;
    
        foreach (var rectangle in blocks.Keys)
        {
            if (point.X >= rectangle.Left && point.X <= rectangle.Right &&
                point.Y >= rectangle.Top && point.Y <= rectangle.Bottom)
            {
                blocks[rectangle].Add(point);
                added = true;
                break;
            }
        }
    
        if (added)
            continue;
    
        Rectangle newRect = new Rectangle(point.X - blockDelta, 
                point.Y - blockDelta, blockDelta*2, blockDelta*2);
    
        blocks.Add(newRect, new List<Point>());
        blocks[newRect].Add(point);
    }
    
    Dictionary blocks=newdictionary();
    常数int blockDelta=50;//像素增量
    foreach(变量点到点)
    {
    bool added=false;
    foreach(块中的变量矩形。键)
    {
    
    如果(point.X>=rectangle.Left&&point.X=rectangle.Top&&point.Y1.虚警像素是亮像素还是暗像素,与红色像素相差很大,因此我建议改用rgb

    2.使用阈值选择“想要的”像素后,您可以尝试放大以恢复丢失的“想要的”像素,因为每个图像中只有四颗大星星,因此您可以根据其包含的像素数选择前四个像素组

    Hi Sergey,有一次我在从事一个涉及图像处理的项目时,遇到的问题是在场地上找到一个红色球。该实现基于BFS算法。目标是找到一组相邻的“红色”像素,像素数最少。在该项目中效果很好。我的建议是使用相同的方法,找到每个像素组的中心作为校准点。图像的亮度和所需颜色变化很大。例如,最亮的像素组的HSL为355、79、66,最暗的像素组的HSL为346、85、24,这就是为什么会出现假警报。我会尝试使用放大,谢谢。