同事让我帮忙处理一些图片曲线,把图片里的曲线坐标搞出来。
我后悔以前不该乱吹牛。我之前确实搞过一个这样的程序,只不过那个程序更像一个探索性的东西,用起来限制很多,稍显鸡肋。
我当时的程序,需要先经过3个步骤的准备,才能开始程序识别坐标。
大概的步骤如下:
Step1. 清场。如果一个图里有很多曲线,要把其他曲线清掉(画图板);
Step2. 断点。如果曲线是连续的,则要把他们分成一个个小段(图板go on);
Step3. 定参考点。图像初步识别的时候,是没有坐标基准的,要在原图里放两个知道坐标的点,用于基准定义;
Step4. 程序运行。程序识别出每一个断点的中心位置坐标。
我大概尝试下,这个流程走下来和直接用线程的GetData软件结果差不多。上面几个步骤里面,前两个步骤耗时比较长。
前年冬天在哈尔滨出差的时候,我对step1和step2尝试过自动化的方法。当时我的方法是这样的:
1)针对step1。我搞出了颜色识别算法,对于一个图好多个颜色的线,能够做到提取特定颜色;
2)针对step2。我的设想是,自动在图里画出白色的竖线或者横线,做到对现有曲线的自动分割。
尝试之后,step2的改进失败。这是因为,如果只画横线或者竖线再或者同时画,如果线定的太密,原有曲线被遮挡严重,丢失信息。如果画的太稀疏,则搞得精度不够。这个度对于不同的图,很难有统一的设定,因此实际用起来意义不大。
如果说一两个图,我用GetData就能很快处理了,一世英名得以保全。拿到手一看,几十个图,每个图2分钟也要搞两三个小时。两三个小时的重复取点工作,光想想,我就觉得自己眼睛会瞎。
我决定砍柴之前再磨一次刀,尝试解决两年前的问题。
1 Step2的解决
实际上,我仔细想了下,之所以出现step2断点操作,主要是我之前的程序里要识别一个封闭区域的中心点,如果曲线连在一起,那么只能得到一个点。
这段程序是我从网上看来的,囫囵吞枣的用了,其实没仔细考虑过。
如果从图片的构成来考虑,我一个图是用像素点拼起来的,我能不能仔细去一个识别每个像素点的信息,进而把构成曲线的像素点识别出来呢?
看了下图片读取后的信息,二值化以后的图片信息是一个m*n的矩阵,这个矩阵每个点的值要么是1要么是0。我把是的区域显示出来,果然发现它就是我要的那个曲线。就这样,step2被解决了。
现在我的程序可以实现曲线自动提取了,但是我现在提取的坐标是每个像素点在图里的相对位置。比如像素点为100*200,那么我最后一个点的坐标是(100,200)。这显然不能直接用啊,我要知道我图片x、y两个方向的尺度,然后才能换算出真实的坐标值。
我原来解决方案是,在图里面实现加入A、B两个点,通过画图板画上去。
按照我原来的方法,这个还要用画图板,有点麻烦,我觉得应该可以简化。
要简化还是要回到图片上来。像素点是均匀的,如果我知道图片x\y两个方向真实的长度,除以两个方向像素点的个数不就可以确定每个像素点的坐标了吗?
按照这个思路,我图片的实际尺寸我是要实现知道的。但是通常图片都有白边界,因此,需要对图片进行截图处理。
根据这个思路,我现在程序效果得到了极大的提升。
改进以后,我现在的程序,分三步:
1)截图。
截图后
3)输入图片两个角点坐标。
4)运行程序。
二值化结果
坐标结果
最后,半个小时处理完了所有图片,一世英名得以保存。
总体来说,目前这个方法相比于GetData,速度更快,不需要手动点选。另外自动提取像素点,所得结果更密、更准,是一次很好的改进体验。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删