使用 Imagemagick 仅显示所有非黑色、非白色像素
Show only all non-black, non-white pixels with Imagemagick
我有一个(灰度)图像,它几乎完全是双色调的,但不完全是。我想查看所有不完全是黑色或白色的像素。
如何使用 Imagemagick 执行此操作?
[我想出了一个方法,我还是会接受其他最好的方法!]
我用
解决了这个问题
convert input.png -transparent black -transparent white \
-alpha extract -negate \
-colorspace rgb -fill red -opaque black \
output.png
思路是这样的:
- 将所有黑色像素转换为透明:
-transparent black
- 白色同上
-transparent white
- 现在我们有一个透明图像,唯一的非透明像素是非黑色、非白色像素
- 将 alpha 通道复制到图像:
-alpha extract
。现在所有旧的 BW 像素都是黑色的,其他的都是白色的。
- 否定图像:
-negate
。现在所有旧的 BW 像素都是白色的,其他的都是黑色的。
如果您想要黑白图像,您可以到此为止。我想要它们是红色的,所以:
- 更改为 RGB 色彩空间(因为我的图像是灰度):
-colorspace rgb
- 将填充颜色设置为红色:
-fill red
- 并将其应用于所有黑色像素(即非黑色或白色的像素):
-opaque black
如果您以加号“+”而不是破折号“-”开头,ImageMagick 或多或少会有“-opaque”的反向版本。此命令会将所有纯白色和纯黑色像素更改为白色,并将所有其他像素更改为红色...
magick bw_img.png -colorspace rgb ^
-fill white -opaque black -fill red +opaque white result.png
设置色彩空间后,第一个“-opaque”操作将用白色填充每个纯黑色像素。当然,所有的白色像素都已经是白色了。
然后将填充颜色改为红色,“+opaque”操作会将非纯白色的每个像素都填充为红色。
这是 Windows 语法。对于 "nix 系统,续行插入符号 "^" 应更改为反斜杠 "\" 或将命令变成单行。
对于 ImageMagick v6,将“magick”更改为“convert”。
编辑添加...
您使用“-transparent”的解决方案很有效,可能是某些工作流程的最佳答案。请记住,有一个带有加号“+”的类似选项,您可以将其与“-transparent”运算符一起使用。举个例子,这将创建输入图像的完全透明版本...
magick logo: -background none -transparent red +transparent red result.png
首先它将每个纯红色像素变为透明,然后将所有非纯红色的像素变为透明。
这很简单 - 虽然可能不是最快的。
# Make any pixel that is pure black or white into white, else black
magick image.png -fx '(u==0)||(u==1)' result.png
或者,显然,相反:
# Make any pixel that is neither pure black nor pure white into white, else black
magick image.png -fx '(u>0)&&(u<1)' result.png
我有一个(灰度)图像,它几乎完全是双色调的,但不完全是。我想查看所有不完全是黑色或白色的像素。
如何使用 Imagemagick 执行此操作?
[我想出了一个方法,我还是会接受其他最好的方法!]
我用
解决了这个问题convert input.png -transparent black -transparent white \
-alpha extract -negate \
-colorspace rgb -fill red -opaque black \
output.png
思路是这样的:
- 将所有黑色像素转换为透明:
-transparent black
- 白色同上
-transparent white
- 现在我们有一个透明图像,唯一的非透明像素是非黑色、非白色像素
- 将 alpha 通道复制到图像:
-alpha extract
。现在所有旧的 BW 像素都是黑色的,其他的都是白色的。 - 否定图像:
-negate
。现在所有旧的 BW 像素都是白色的,其他的都是黑色的。
如果您想要黑白图像,您可以到此为止。我想要它们是红色的,所以:
- 更改为 RGB 色彩空间(因为我的图像是灰度):
-colorspace rgb
- 将填充颜色设置为红色:
-fill red
- 并将其应用于所有黑色像素(即非黑色或白色的像素):
-opaque black
如果您以加号“+”而不是破折号“-”开头,ImageMagick 或多或少会有“-opaque”的反向版本。此命令会将所有纯白色和纯黑色像素更改为白色,并将所有其他像素更改为红色...
magick bw_img.png -colorspace rgb ^
-fill white -opaque black -fill red +opaque white result.png
设置色彩空间后,第一个“-opaque”操作将用白色填充每个纯黑色像素。当然,所有的白色像素都已经是白色了。
然后将填充颜色改为红色,“+opaque”操作会将非纯白色的每个像素都填充为红色。
这是 Windows 语法。对于 "nix 系统,续行插入符号 "^" 应更改为反斜杠 "\" 或将命令变成单行。
对于 ImageMagick v6,将“magick”更改为“convert”。
编辑添加...
您使用“-transparent”的解决方案很有效,可能是某些工作流程的最佳答案。请记住,有一个带有加号“+”的类似选项,您可以将其与“-transparent”运算符一起使用。举个例子,这将创建输入图像的完全透明版本...
magick logo: -background none -transparent red +transparent red result.png
首先它将每个纯红色像素变为透明,然后将所有非纯红色的像素变为透明。
这很简单 - 虽然可能不是最快的。
# Make any pixel that is pure black or white into white, else black
magick image.png -fx '(u==0)||(u==1)' result.png
或者,显然,相反:
# Make any pixel that is neither pure black nor pure white into white, else black
magick image.png -fx '(u>0)&&(u<1)' result.png