Fork me on GitHub

C# 根据波形图片,提取测试数据点 Winform

0
其主要思路就是提取图片每个1px宽度上面的像素点,每个宽度只提取一个,并用Point记录这个像素点的 x和y。这样做的前提是图片除了波形有明显颜色以外,其他地方的像素点都能被排除,最方便的就是把排除区域变透明。但在这里我遇到了个问题,明明图片看着透明了,但其实Color的透明度不一定是0,就无排除无效的点,反而是把这种透明点算成波形上的点了,最后提取出来的波形就是错误的。
对于图片的透明操作,我是在这个网站做的:稿定。https://www.uupoop.com/#/,专业版导图什么的也不收费,只需要注册就行。
具体操作也简单:
颜色不杂的图片可以用矩形工具填充白色把杂色遮住。
然后
滤镜 锐化 可以加深保留的颜色这步可以省略。
最后
其他 ColorToAlpha,把图片变为透明图片。
我一个不会ps的,自己摸索一阵子,就能成。
然后获取图片像素的方法:
public static void GetImagePixelV3(Bitmap img, ref Dictionary<Point, Color> dicsMax)
        {
            for (int i = 0; i < img.Width; i++)
            {
                for (int j = 0; j < img.Height; j++)
                {

                    var color = img.GetPixel(i, j);
                    
                    if (color.A == 0 && color.B == 0 && color.G == 0 && color.R == 0)
                    {
                        continue;
                    }
                   
                    else
                    {
                        if (color.A <128)//透明度
                        {
                            continue;
                        }

                        var pt = new Point(i, j);
                        
                        dicsMax[pt] = color;
                        break;
                    }

                }
            }
            
        }

  

画图:就GD+
var map = new Bitmap(ImgWidth, ImgHeight);
            var g = Graphics.FromImage(map);
             for (int i = 0; i < DicsTop.Count; i++)
            {

                var pt2 = DicsTop.ElementAt(i).Key;
                points.Add(pt2);
            }
            points.Sort((x1, x2) =>
            {
                return x1.X - x2.X;
            });

            for (int i = 1; i < points.Count; i++)
            {
                var pt1 = points[i - 1];
                var pt2 = points[i];
                g.DrawLine(Pens.Blue, pt1, pt2);
            }
            g.Dispose();
            picDraw1.BackgroundImage = map;

 

posted @ 2022-02-25 15:09  HelloLLLLL  阅读(357)  评论(0编辑  收藏  举报