我正在编写一个代码,生成一幅图片(栅格图像)的开始点和结束点,以让机器人手臂绘制。
我写了一个算法,但是有太多重叠的笔画:https://github.com/Evrid/Painting-stroke-generation-for-robot-arm-or-CNC-machine
我的算法的输入:

和50 ThresholdOfError的输出(它镜像并重新分配给我的颜色)(您可以看到笔画是重叠的):

值得注意的是:
*笔画必须不重叠(如果重叠,则笔画太多)
*绘画有不同的颜色,同样的颜色最好画在一起
*笔画的大小就像矩形
*一些染色区域被断开,就像从向日葵的黄色下面:

我不确定我应该使用哪种算法,以下是我考虑过的一些可能的算法:
方法1.Generate 50k (或更多)随机方向和位置较大的矩形,如果其面积重叠相同的颜色区域,而不是重叠其他矩形,然后保持它,然后减少生成的矩形大小,并在几轮后继续减少。
方法2.Extract特定颜色,然后生成任意方向和位置的大矩形(我们有较少的面积和计算时间)
方法3.Do边缘检测,然后沿边缘方向生成矩形,如果其区域重叠于同一颜色区域,而不重叠其他矩形,则保持该区域,然后减小生成的矩形大小,并在两轮后继续减小。
方法4:生成随机圆,让笔画点代替(但可能导致太多点)
关于我应该使用哪种算法,有什么建议吗?
发布于 2022-07-08 06:59:18
首先,我想:
因此,将颜色减少到您的调色板(请参阅:)
- [Effective gif/image color quantization?](https://stackoverflow.com/a/30265253/2521214)
- [Converting BMP image to set of instructions for a plotter?](https://stackoverflow.com/a/36820654/2521214)用相似的颜色
为此,可以使用flood fill或growth创建ROI形式的标签(区域索引)。
请参阅Fracture detection in hand using image proccessing
这是简单的孵化,您可以通过在ROI的主要方向上生成具有“大”画笔宽度的锯齿状路径来实现这一点,因此可以使用AABB或OBB或PCA来检测主方向(ROI最大的方向),以及使用多边形ROI来检测主方向。
这也被称为轮廓提取,只需选择选定的ROI的边界像素,那么您就可以使用ROI边界上的A*将像素分成2半(或者更多,如果复杂的形状带有孔或薄的部分),所以backtrack the pixels然后重新排列它们形成一个闭环。
这将保留边界上的细节(同时使用粗刷填充)。
就像这样:

如果您的颜色是可组合的,您可以使用CMY颜色空间和Substractive color mixing,并分别处理每一个C,M,Y通道(最多3重叠笔画)有更好的颜色匹配。
如果您想要更好的颜色,您也可以添加dithering,但是这会大大降低画图的速度,因为它需要更多的路径段,而且对于工具上下移动的绘图仪来说也不是最理想的(它们更适合打印头或打印,而不需要额外的移动…)。要部分克服这个问题,可以使用partial dithering,其中可以指定所创建的抖动量(导致较少的分段)。
--有很多东西你可以改进/添加到这里,比如:
从ROI中删除轮廓(为了限制重叠和防止细节overpaint)
发布于 2022-07-07 12:38:57
建议你使用洪水填充算法。
当整个图片被覆盖时,按颜色对矩形进行排序。
https://stackoverflow.com/questions/72897867
复制相似问题