怎么得到光滑的线条?

runerback 2017-02-08 04:23:59
比如把下图这样的变成下下图那样的




已经得到了对应的二维数组
...全文
568 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
runerback 2017-02-13
  • 打赏
  • 举报
回复
另外这个不是工作中遇到的,而是我一时兴起突然想起以前老师说过什么0和1的矩阵里走迷宫的,想搞个走迷宫算法…… 所以回帖比较慢,大神别走啊..
runerback 2017-02-13
  • 打赏
  • 举报
回复
在图中找到以下形状的九宫格并填充为黑色,然后去掉重复的行列。


执行了五遍之后得到了这样的结果:


剩下的那些大块的可以填充的部分感觉得搞个16宫格
runerback 2017-02-13
  • 打赏
  • 举报
回复
你们的回答都看过了,但是感觉思路还是不清晰。
用腐蚀算法的话,不知道如何得到腐蚀块的大小形状,因为我想做的是不只局限于这张图,而是通用性强一些的。
边缘检测那个最后一步找单点的,有些需要去掉,有些需要留着(影响到线段长度的单点),只找九宫格明显数据不足。
粗颗粒网格的大小只能慢慢试,这样换张图就很麻烦。

一开始采样的时候处理这个我数学比较差……
统计出的灰度分布是介样的:

序号 灰度 个数 比例


不知道有什么算法能得到合理的二值化结果。
白衣如花 2017-02-09
  • 打赏
  • 举报
回复
你的线条粗细不均,可能是二值化时阈值有问题 也可以最后合并(连续两行线条,认为是一条,同理两列)
白衣如花 2017-02-09
  • 打赏
  • 举报
回复
估计得一个个试阈值 灰度图二值化,167应该是0还是255?这个要慢慢试 二值化后的矩阵,可以看看规律,线条宽度一般是多少,比如3 你可以每三行取一行,每三列取一列,得一个较小矩阵 最后把断掉的线修复一下(该点上下都为1,则认为它也为1,同理左右)
Poopaye 2017-02-09
  • 打赏
  • 举报
回复
最后再找出垂直组和水平组之间的公共的交点 能想到就这么多了
Poopaye 2017-02-09
  • 打赏
  • 举报
回复


至于粗的线会得到好几条,我想到2种筛选办法
比如水平方向上的线,比较任意两条(红色和黄色)在水平方向上的交集,如果交集也是连续的线,那么这两条就可以合并。
这图有个特例是最顶上和最低下(红色和绿色),可以比较同一水平位置连线上是否有0,如果有就说明是分在2段上的线

筛选不是要选出【最长的】
而是把属于同一边的线分到一组里
因为有可能【最长的】线和垂直的【最长的】线是不相交的
Poopaye 2017-02-09
  • 打赏
  • 举报
回复
引用 5 楼 shaoerbao 的回复:
我不知道怎么才能找出【连续的】【最长的】边,尤其是拐角的地方。。
如果只是水平或垂直的话 从1出发,沿其中一个方向,如果还是1,那就是一条边 只要遍历所有的点,最终能得到水平或垂直方向上所有【连续的】线
卧_槽 2017-02-09
  • 打赏
  • 举报
回复
变形的图像腐蚀算法 http://blog.csdn.net/minushuang/article/details/50435689 你这里要注意的应该是细化后不能出现斜线,出现的话要再写一个处理。
wanghui0380 2017-02-09
  • 打赏
  • 举报
回复
http://blog.csdn.net/yansmile1/article/details/46461655
wanghui0380 2017-02-09
  • 打赏
  • 举报
回复
减少采样点,然后在插值 当然也可以傅里叶后滤掉杂波 ps:这种玩意你应该去算法版问菜合理
xuzuning 2017-02-09
  • 打赏
  • 举报
回复
使用网上 Hilditch 细化算法 可得

显然不很近人意

因此需要自行书写代码了
思路是给图片套一个粗颗粒的网格,比如16x20
判断格中内容,以确定该格是否为空
链接非空格的中心点,就是期望的单线图形

代码有空再贴
runerback 2017-02-08
  • 打赏
  • 举报
回复
至于是不是一个单位,只要所有的线段宽度都相等就行了,后面会有算法将“重复的”部分去掉的。 比如: 0,0,0,0,0,0,0,0 0,0,1,1,1,1,0,0 0,0,0,0,0 0,0,1,1,1,1,0,0 0,1,1,1,0 0,0,1,0,1,1,0,0 -> 0,1,0,1,0 0,0,1,0,1,1,0,0 0,1,1,1,0 0,0,1,1,1,1,0,0 0,0,0,0,0 0,0,1,1,1,1,0,0 0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0
runerback 2017-02-08
  • 打赏
  • 举报
回复
引用 4 楼 shingoscar 的回复:
光2张图
没有完整的规则,也没用
但有了规则写出代码即可

原图是百度图片搜索“迷宫”出来的。。原图最开始的时候只有黑白两色无杂色,但后来里面会有一些杂色,
我在处理的时候把127以下的置为0, 128以上的置为1,就得到了我传到网盘里的那个数组。
对于
我将 每条连续的边中最长的那条 之外的黑色换成了白色并且让留下来的黑色边的宽度都是1个单位,得到了
我不知道怎么才能找出【连续的】【最长的】边,尤其是拐角的地方。。
Poopaye 2017-02-08
  • 打赏
  • 举报
回复

光2张图
没有完整的规则,也没用
但有了规则写出代码即可
runerback 2017-02-08
  • 打赏
  • 举报
回复
引用 2 楼 xuggzu 的回复:
不太明白lz意思,既然有了光滑线数组,直接画线不就得了?
我那个数组是第一张图里的那个样子的,不是第二张图。。
xuggzu 2017-02-08
  • 打赏
  • 举报
回复
不太明白lz意思,既然有了光滑线数组,直接画线不就得了?
runerback 2017-02-08
  • 打赏
  • 举报
回复
为了方便大神测试,我把数据传到网盘

数据格式如下

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧