ImageMagick - 将轮廓图像转换为完美的黑白,无噪点

ImageMagick - Transform Outline Image to Perfect Black And White, WIth No Noise

提问人:BlasterGod 提问时间:9/19/2023 最后编辑:BlasterGod 更新时间:9/20/2023 访问量:91

问:

我正在寻找一个图像魔术命令,它可以帮助我将黑白轮廓图像(涂鸦草图)转换为完美的白色背景和完美的黑色线条(甚至没有抗锯齿)。我需要这个,这样我就可以使用自动跟踪将它们转换为完美的中心线 SVG。

问题是我无法发出适合我处理的所有图像的命令。 以下是我想转换的 2 张图像:IMAGE1 IMAGE2

如果你看一下 IMAGE2,我想去除黑线周围的所有白点和噪点。 我尝试了很多组合和命令,但没有任何效果。 几乎起作用的最接近的命令是:convert 2.png -threshold 50%% -negate -morphology Dilate Diamond:1 -negate -gaussian-blur 1 -unsharp 0x1 77.ppm

我尝试使用其他参数,例如: 但无法获得我想要的好结果。+level-colors black, -statistic mean 15x15 -level 25%,75% -canny 0x1+10%+30% -blur 0x10 -unsharp 0x10

在 IMAGE2 中,我特别想删除所有“模糊”,如下所示,但在那里保持一条清晰的黑线:enter image description here

任何帮助都是值得赞赏的。我的主要目标是使用获得的图像通过自动跟踪获得中心线跟踪。 主要问题之一是狗的右眼,它离头部很近,在头部线和右眼之间,有嘈杂的像素。我想把它们变成完美的白色,这样我就可以完美地界定一切,并在完美的白色背景上获得清晰的黑线(即使没有抗锯齿)。

编辑1:对我来说,对于图像2(有狗的孩子),当我应用阈值时,我得到的结果与其他人不同。我正在使用 image magick 7.1.1 。您能否尝试在图像 https://sodevrom.net/2.png(此确切的图像)上应用阈值,并让我知道您是否获得了良好的结果?

编辑2:命令 -blur 0x1 -threshold 50%% -blur 0x1为我提供了 image2 的所需结果。image1 的问题在于线条非常细。当我应用相同的命令时,一些行被截断,如下所示。https://imgur.com/xST1WRq我不希望这种情况发生。有什么想法吗?

编辑3:我找到了适合我的最后一个命令。 转换 2.png -阈值 50%% -否定 -形态学 打开钻石:1 -否定 -模糊 0x1 77.ppm

这非常适合 IMAGE2,而 -morphology Dilate Diamond:1 非常适合 IMAGE1。会找到一个折衷方案,因为很难让它完美地适用于所有类型的图像。

imagemagick imagick imagemagick-convert

评论

0赞 fmw42 9/19/2023
如果您只使用 -threshold 50%,并且除了输出图像之外没有其他内容,则应该不会出现模糊。命令中的大多数其他处理都会增加模糊性。
0赞 fmw42 9/19/2023
一旦你有了抗锯齿,如果你达到阈值,你可能会得到阶梯。您将无法移除楼梯并在黑线上制作平滑的边缘。即使可以,图像是数字(像素)这一事实也意味着您将在对角线边缘上踩踏楼梯。你到底想做什么?“酥脆”是什么意思
0赞 BlasterGod 9/19/2023
使用 -threhold 50% 可以得到这个: imgur.com/rKbfNj5 所以这不是我要找的。我正在寻找黑白图像。即使它具有没有抗锯齿的阶梯效果。
0赞 xenoid 9/19/2023
轻微的高斯或中值模糊,然后是阈值或高对比度:i.imgur.com/d0sZpCd.png
0赞 fmw42 9/19/2023
尝试结果。或者只是使用与 50% 不同的阈值(更大的阈值,例如 75% 或 90%)。convert image -negate -threshold 0 -negate

答:

0赞 fmw42 9/20/2023 #1

在 Imagemagick 中将 -auto-level 添加到阈值 50% 命令中,将黑色拉伸到 0,将白色拉伸到 255。

Unix IM 6 语法:

convert image1.jpg -auto-level -threshold 50% result1.png

enter image description here

convert image2.png -auto-level -threshold 50% result2.png

enter image description here

对于 IM 7,请使用 magick 而不是 convert。对于 Windows,将 % 转义为 %%。

评论

0赞 BlasterGod 9/20/2023
我正在使用 image magick 7.1.1,但我没有得到这个结果。我得到 i.imgur.com/d0sZpCd.png 在图像 sodevrom.net/2.png 上尝试命令它对你有用吗?即使它有效,结果也不完全是我需要的。我想删除各个噪音点,例如 imgur.com/ut5mdQx
0赞 fmw42 9/20/2023
在 Imagemagick 7 上,使用 magick 而不是 convert。
0赞 BlasterGod 9/20/2023
很奇怪,结果一样。我使用了 magick 2.png -auto-level -threshold 50% 77.ppm,我得到 imgur.com/vewnlwH 我也尝试安装映像 magick 6.9(旧版),我再次得到相同的图像
1赞 fmw42 9/20/2023
如果您使用的是 Windows,则需要将 % 转义为 %%。所以试试吧magick 2.png -auto-level -threshold 50%% 77.ppm
1赞 fmw42 9/20/2023
好的,那么我明白你为什么在最后添加 -blur。尝试在阈值之后使用 -morphology erode diamond:1 或 diamond2 在最终 -blur 之前稍微加粗线条。或者做最后的模糊,但在最终模糊之后添加 -level 0x50%% 或可能的 -level 50x100%%(尝试每个,看看哪个更好/正确)。
1赞 fmw42 9/20/2023 #2

这在 Imagemagick 7 中更好吗?将 -blur 0x1添加到命令中。

magick image1.jpg -blur 0x1 -auto-level -threshold 50% result1.png

enter image description here

magick image2.png -blur 0x1 -auto-level -threshold 50% result2.png

enter image description here

如果没有,请尝试增加 -blur 0x2。

或者尝试将 -morphology open diamond:2 添加到命令中,作为

magick image1.jpg -auto-level -threshold 50% -morphology open diamond:2 result5.png

enter image description here

magick image2.png -auto-level -threshold 50% -morphology open diamond:2 result6.png

enter image description here

如果需要,增加菱形:X 尺寸或更改开口以侵蚀以加粗线条。

评论

0赞 BlasterGod 9/20/2023
谢谢。使用 -blur 0x1 -threshold 50%% -blur 0x1 可以获得图像 2 的出色效果。但是请尝试使用图像 sodevrom.net/77.jpg 不幸的是,它不起作用,因为线条太细了。
1赞 fmw42 9/20/2023
正如我上面所说,添加 -blur AFTER -threshold 将引入 0 和 255 以外的值。尝试 -blur 0x1 -threshold 50%% -morphology open diamond:1 or diamond:2
0赞 fmw42 9/20/2023 #3

这是另一个想法。JPG 图像具有压缩伪影,需要至少 15% 的阈值才能去除。因此,让我们在 Imagemagick 的阈值中使用 25% 而不是 50%。

Unix Imagemagick 7 语法:

magick image1.jpg -auto-level -threshold 25% -morphology open diamond:2 result7.png

enter image description here

magick image2.png -auto-level -threshold 25% -morphology open diamond:2 result8.png

enter image description here

** 对于 Windows,请将 % 转义为 %%。对于 Imageamgick 6,将 magick 替换为 convert**