如何实现非二值图圆形半径图像的最大值和最小值算法及其实时优化策略?
摘要:在图像处理中,我们可以看到很多函数都是带有半径这个参数的,不过99%的情况下这个半径其实都是矩形的意思,实际的需求中,还有很多场合下需要圆形的最值算法,我们目前知道的有几个算法,比如在Photoshop中,选区的扩展和收缩,在图层样式的描边
在图像处理中,我们可以看到很多函数都是带有半径这个参数的,不过99%的情况下这个半径其实都是矩形的意思,在目前我所实现的算法中,也只有二值图像的最大值和最小值我实现了圆形半径的优化,可以参考:SSE图像算法优化系列二十五:二值图像的Euclidean distance map(EDM)特征图计算及其优化一文,这里通过特征图实现了圆形半径算法的O(1)算法。
在实际的需求中,还有很多场合下需要圆形的最值算法,我们目前知道的有几个算法,比如在Photoshop中,选区的扩展和收缩,在图层样式的描边算法中等等,都不是普通的矩形半径。所以这个算法的优化也有着非常重要的意义。
在可以搜索到的资料中,我曾经在2个地方看到关于这个算法的优化实现,一个是ImageJ中,其UI界面下的功能如下所示:
我们尝试了下,在小半径下,这速度还是比较快的,\但是半径稍大时,就相对来说有点慢了。这个相关的代码可以在RankFilters.java中找到。
还有一个可以参考的代码是在GIMP中,这个也是我无意中寻得的,其代码路径分别在:
gimp-master\app\operations\gimpoperationgrow.c 和 gimp-master\app\operations\gimpoperationshrink.c文件中。
在GIMP中这个函数的主要作用也是对选区进行收缩和扩展。
原始选区 GIMP的扩展50像素 PS的扩展50像素
由以上图像看上去,似乎PS的扩展选区用的还是菱形半径,而不是圆形。
