平滑锯齿状的路径

前几天,我参加了将Image / Graphic转换为Shape的活动,并尝试通过在上添加Rectangle迭代来获取图像轮廓Area。那太慢了。


该示例改为构建GP GeneralPath并Area从GP 创建。快多了。

http://img2.mukewang.com/5da1350800014a2203100367.jpg

左上方的图像是“源图像”。右边的两个是处理轮廓的各个阶段。它们都在圆周围和三角形的斜边上有锯齿状的边缘。


我想获得一种消除或减少锯齿状的形状。


在ASCII艺术中。

情况1:

  1234

1 **

2 **

3 ***

4 ***

5 ****

6 ****

角在:


(2,3)内角

(3,3)

(3,5)内角

(4,5)

情况2:

  1234

1 ****

2 ****

3 **

4 **

5 ****

6 ****

角在:


(4,2)

(2,2)内角

(2,5)内角

(4,5)

假设我们的路径具有所示的形状和列出的点,我想删除第一组的“内角”点,同时保留“成对”的内角(从图像中咬出) 2号


有人可以建议一些聪明的内置方法来完成这项工作吗?

如果不这样做,什么是识别内角位置和性质(成对/单个)的好方法?(我想我可以得到一个PathIterator并建立一个新的GeneralPath下降单数内角的方法-如果只有我能弄清楚如何识别它们的话!)。


MM们
浏览 427回答 3
3回答

不负相思意

这是一个大课题。您可能会发现Johannes Kopf和Dani Lischinski 撰写的Depixelizing Pixel Art 1很有用:它是可读的,最新的,包括以前工作的摘要,并详细说明了他们的方法。另请参见涵盖类似背景和视频(!)的幻灯片。这是“最近邻居”与“他们的技术”文档中的一些屏幕截图。 

湖上湖

此问题的最通用版本是大多数计算机视觉管道中的初始阶段之一。这就是所谓的图像分割。它将图像划分为可视上相同的像素区域。这些区域由“轮廓”(例如参见本文)分隔开,“轮廓” 相当于穿过图像的沿像素边界延伸的路径。有一种简单的递归算法,用于将轮廓表示为定义的折线,以使轮廓中的任何点的偏差都不会超过max_dev您选择的某个固定量(例如)。通常是1/2到2像素。function getPolyline(points [p0, p1, p2... pn] in a contour, max_dev) {&nbsp; if n <= 1 (there are only one or two pixels), return the whole contour&nbsp; Let pi, 0 <= i <= n, be the point farthest from the line segment p0<->pn&nbsp; if distance(pi, p0<->pn) < max_dev&nbsp;&nbsp; &nbsp; return [ p0 -> pn ]&nbsp; else&nbsp; &nbsp; return concat(getPolyline [ p0, ..., pi ],&nbsp; getPolyline [ pi, ..., pn] )其背后的想法是,您似乎已经将卡通图像分割了。因此,如果您编写了将边缘像素组合成链的简单搜索,则可以使用上述算法将它们转换为平滑的线段链。甚至可以使用抗锯齿来绘制它们。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java