我正在寻找一种以编程方式重新创建以下效果的方法:
提供输入图像:
input http://www.shiny.co.il/shooshx/ConeCarv/q_input.png
我想迭代地应用“笔画”效果
第一步看起来像这样:
step 1 http://www.shiny.co.il/shooshx/ConeCarv/q_step1.png
第二步是这样的:
alt text http://www.shiny.co.il/shooshx/ConeCarv/q_step2.png
等等。
我认为这将涉及某种边缘检测,然后以某种方式追踪边缘 是否有一种已知的算法以高效和稳健的方式做到这一点?
答案 0 :(得分:6)
基本上,根据this thread自定义算法:
围绕像素取3x3邻域,对alpha通道进行阈值处理,然后查看像素周围的8个像素中是否有任何一个像素值。如果是这样的话 给定半径的圆,中心位于像素处。在内部/外部,通过阈值化的alpha通道进行调制(否定进行另一侧)。如果圆半径大于像素(可能是),则必须对较大的邻域进行阈值处理。
这是使用灰度形态学操作实现的。这也是用于扩展/收缩选择的相同技术。基本上,要划分选择(或alpha通道)的中心,人们要做的是首先制作两个单独的选择副本。第一个选择将通过笔划的半径扩展,而第二个选择将缩小。然后通过从第一个选择中减去第二个选择来获得笔画的不透明度。
为了做内外笔画,你会收缩/扩展两倍半径并减去与原始选择相交的部分。
应该注意,最通用的形态算法需要O(m * n)个运算,其中m是图像的像素数,n是“结构元素”中的元素数。但是,对于某些特殊情况,可以优化O(m)操作(例如,如果结构元素是矩形或菱形)。