找到要裁剪的图像的矩形区域

y

我的图像尺寸为(352 x 240)
在此处输入图片说明

我想裁剪白色区域(选定区域如下所示)。
在此处输入图片说明

我使用此代码裁剪图像,

private static Image cropImage(Image img, Rectangle cropArea)
{
   Bitmap bmpImage = new Bitmap(img);
   Bitmap bmpCrop = bmpImage.Clone(cropArea,
   bmpImage.PixelFormat);
   return (Image)(bmpCrop);
}

但是我找不到我需要的确切矩形区域!
如何找到Rectangle选定区域的价值?
我只想播种这个区域!谢谢 !

塔瓦

如果您想自己做,当然可以。但是,如何做到最好的细节在很大程度上取决于您对源图像的了解程度。

以下是一些要考虑的问题和决定:

  • 你知道图像的尺寸吗
  • 您是否知道图像的位置,它总是在右下角吗?
  • 您知道偷工减料的大小吗?
  • 你知道颜色吗?
  • 您是希望减少内部损失一些像素,还是减少外部或中间途径的一些像素?

查看您的示例,您可以例如尝试以下策略:

  • 首先,您需要以一定的距离水平移动图像,例如以10或20为切片。
  • 在直线的每个横向上,您观察并收集像素改变颜色的所有点
  • 然后您比较结果列表以查看中间是否有同意的(!)
  • 这为您提供了左右边界
  • 它还为您提供了一个可以进行垂直扫描的区域
  • 然后重复进行垂直扫描以获取顶部和底部坐标。
  • 垂直扫描不必搜索矩形,它们可以从水平扫描结果的中间开始工作

为此,您必须对预期的颜色变化有所了解:是否会涉及平滑处理?如果是这样,您需要比较什么变化水平的GetPixel颜色?

同样,尺寸应该大约已知,否则您可能需要使用更细的网格重复整个过程。

编辑:使用评论中的信息,您可以做一些假设(*),然后使用这段代码来确定目标矩形。这些假设用于:

  • 确定两个扫描线范围,在这些范围内可以假定扫描击中目标的主体
  • 确定两个像素的内部和外部颜色

我使用了色差功能和4个点数列表,并在几次点击中求平均值。该变量blur的图像值为2-6。

List<Point> xPoints1 = new List<Point>();
List<Point> xPoints2 = new List<Point>();
List<Point> yPoints1 = new List<Point>();
List<Point> yPoints2 = new List<Point>();

Rectangle findRectangle()
{
    int xMax = pictureBox1.Image.Width; 
    int yMax = pictureBox1.Image.Height;

    // * we can asume that these lines hit the body
    int x0 = xMax * 3 / 4;
    int y0 = yMax * 3 / 4;

    using (Bitmap bmp = new Bitmap(pictureBox1.Image) )
    {
        // we can assume that these are the out- and inside colors
        Color col0 = bmp.GetPixel(9, 9);
        Color col1 = bmp.GetPixel(x0, y0);

        int blur = 4;
        int diff = colordistance(col0, col1) / blur;

        bool outside = true;
        // a few horizontal scans..
        for (int y = y0 - 20; y < y0 + 20; y += 4)
        {
          outside = true;
          for (int x = 0; x < xMax; x++)
          {
            Color c = bmp.GetPixel(x, y);

            if ( outside && colordistance(c, col0) > diff)
               { outside = !outside; xPoints1.Add(new Point(x, y)); }
            else if (!outside && colordistance(c, col1) > diff) 
               { outside = !outside; xPoints2.Add(new Point(x, y)); }
            }
        }              

        // a few vertical scans..
        for (int x = x0 - 20; x < x0 + 20; x += 4)
        {
           outside = true;
           for (int y = 0; y < yMax; y++)
           {
              Color c = bmp.GetPixel(x, y);
              if (outside && colordistance(c, col0) > diff) 
                  { outside = !outside; yPoints1.Add(new Point(x, y)); }
              else if (!outside && colordistance(c, col1) > diff) 
                  { outside = !outside; yPoints2.Add(new Point(x, y)); }
           }
        }

        int left   = (int)xPoints1.Average(p => p.X);
        int right  = (int)xPoints2.Average(p => p.X);
        int top    = (int)yPoints1.Average(p => p.Y);
        int bottom = (int)yPoints2.Average(p => p.Y);
        // if the target sits at the bottom we didn't find the edge
        if (bottom == 0) bottom = yMax;

        return = new Rectangle(left, top, right - left, bottom - top);

    }
}

int colordistance(Color c1, Color c2)
{
    return (int) Math.Sqrt((c1.R - c2.R) * (c1.R - c2.R) +
        (c1.G - c2.G) * (c1.G - c2.G) +
        (c1.B - c2.B) * (c1.B - c2.B));

}

注意:顶部和左侧的值命中目标的内部。底部(可能还有底部)撞到外面。因此,应根据需要将前者或后者减少1个像素。

编辑第一个版本的outside变量设置在错误的位置。已更正。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

擦除 PIL 图像的矩形区域

来自分类Dev

如何从图像中裁剪出最大的矩形

来自分类Dev

使用缩放并拖动矩形来裁剪图像

来自分类Dev

使用动态矩形坐标裁剪图像

来自分类Dev

声明要搜索图像的区域?

来自分类Dev

Word 2010自动裁剪要插入的图像

来自分类Dev

在选定区域中从uiimagepickerviewcontroller裁剪图像

来自分类Dev

如何使用JavaScript裁剪图像的区域?

来自分类Dev

使用openCV裁剪图像的区域(java)

来自分类Dev

在裁剪成矩形大小的同时在QML中缩放图像

来自分类Dev

如何用矩形以外的其他形状裁剪图像?

来自分类Dev

如何在Android中以矩形为基础裁剪图像?

来自分类Dev

如何在CameraX上的相机预览中裁剪图像矩形

来自分类Dev

如何在Android中以矩形为基础裁剪图像?

来自分类Dev

使用 ImageMagick 将图像裁剪为圆角矩形

来自分类Dev

从WPF中的图像裁剪对角线区域

来自分类Dev

如何按路径而不是区域裁剪画布图像

来自分类Dev

OpenCV C ++检测并裁剪图像上的白色区域

来自分类Dev

Python:沿边界从图像中裁剪出区域

来自分类Dev

Tensorflow:裁剪图像的最大中心正方形区域

来自分类Dev

在图像中找到相似区域的好的算法?

来自分类Dev

如果使用Matlab图像,则区域周围的最小矩形边界框

来自分类Dev

如何圈出/突出显示/矩形化图像的某些区域?

来自分类Dev

Kinect JS裁剪矩形

来自分类Dev

裁剪图像后,如何找到新的边界框坐标?

来自分类Dev

如何在图像中找到明亮区域(以及如何在图像中找到阴影区域)

来自分类Dev

在图像中找到没有清晰边框/边缘的矩形空间

来自分类Dev

如何在图像中找到所有矩形瓷砖?

来自分类Dev

通过指定四个角点(非矩形)来裁剪图像

Related 相关文章

  1. 1

    擦除 PIL 图像的矩形区域

  2. 2

    如何从图像中裁剪出最大的矩形

  3. 3

    使用缩放并拖动矩形来裁剪图像

  4. 4

    使用动态矩形坐标裁剪图像

  5. 5

    声明要搜索图像的区域?

  6. 6

    Word 2010自动裁剪要插入的图像

  7. 7

    在选定区域中从uiimagepickerviewcontroller裁剪图像

  8. 8

    如何使用JavaScript裁剪图像的区域?

  9. 9

    使用openCV裁剪图像的区域(java)

  10. 10

    在裁剪成矩形大小的同时在QML中缩放图像

  11. 11

    如何用矩形以外的其他形状裁剪图像?

  12. 12

    如何在Android中以矩形为基础裁剪图像?

  13. 13

    如何在CameraX上的相机预览中裁剪图像矩形

  14. 14

    如何在Android中以矩形为基础裁剪图像?

  15. 15

    使用 ImageMagick 将图像裁剪为圆角矩形

  16. 16

    从WPF中的图像裁剪对角线区域

  17. 17

    如何按路径而不是区域裁剪画布图像

  18. 18

    OpenCV C ++检测并裁剪图像上的白色区域

  19. 19

    Python:沿边界从图像中裁剪出区域

  20. 20

    Tensorflow:裁剪图像的最大中心正方形区域

  21. 21

    在图像中找到相似区域的好的算法?

  22. 22

    如果使用Matlab图像,则区域周围的最小矩形边界框

  23. 23

    如何圈出/突出显示/矩形化图像的某些区域?

  24. 24

    Kinect JS裁剪矩形

  25. 25

    裁剪图像后,如何找到新的边界框坐标?

  26. 26

    如何在图像中找到明亮区域(以及如何在图像中找到阴影区域)

  27. 27

    在图像中找到没有清晰边框/边缘的矩形空间

  28. 28

    如何在图像中找到所有矩形瓷砖?

  29. 29

    通过指定四个角点(非矩形)来裁剪图像

热门标签

归档