删除黑线,整个图像的变化最小

Sel*_*ron 6 algorithm image pixel colors image-processing

我有多边形的图像.这些多边形有黑线.我需要一种方法来删除这些黑色线条与最小的多边形改变.到目前为止我尝试了什么:

Step 1) parse the image from the top left corner to the bottom right corner(line by line).
Step 2) Loop through each pixel of a line/row.
Step 3) If you encounter a non-black pixel, put the color value of it in 
        a variable (lets call it lastNonBlack). 
Step 4) If you encounter a black pixel, just overwrite it's color value with lastNonBlack.
Run Code Online (Sandbox Code Playgroud)

这是该算法的问题.在某些情况下,它会分割多边形(请参见第一张图片),或者用一条线将多边形展开(参见第二张图片).

在此输入图像描述

在此输入图像描述

然后我尝试了另一种方法,我采用上面的像素的颜色,但也不起作用.不是"分裂"和"扩展"不是水平的而是垂直的.

PS:我使用Java所以java解决方案最好但是因为这是一个算法问题,所以欢迎任何人:)

编辑:上面的图片是构建示例,向您展示问题.我的图片看起来像这样:

在此输入图像描述

edit2:我用更大的图像替换了更好的图像

Mar*_*ell 1

由于算法很受欢迎,我将向您展示如何使用 ImageMagick 来实现这一点,大多数 Linux 发行版上都安装了 ImageMagick,并且适用于 OSX 和 Windows。

我的算法是制作一个所有黑色像素都是透明的蒙版,然后将其覆盖在原始图像的中值滤波副本之上。在经过中值滤波的图像中,黑色像素将落在每个点处的已排序像素集的底部,因此永远不会被选为中值,因此只有附近的彩色像素才能成为新的输出像素。然后将黑色像素转换为透明的蒙版图像叠加,以便原始图像中只有黑色像素变得透明,在这些位置您可以透过原始图像看到经过中值滤波的图像。这比听起来容易......

使黑色像素透明:

convert in.png -transparent black mask.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

生成 7x7 邻域中值的滤波图像

convert in.png -median 7x7 median.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在中值滤波图像之上叠加蒙版,因此滤波后的图像仅在黑色像素处显示(现在是透明的)

convert median.png mask.png -composite result.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述