Image processing imagemagick:删除被透明度包围的所有杂散像素

Image processing imagemagick:删除被透明度包围的所有杂散像素,image-processing,command-line,imagemagick,Image Processing,Command Line,Imagemagick,你好我想从透明图像中删除所有出现的杂散像素 以下是为方便起见放大的示例图像: 以下是相同的图像,但我希望它在处理后看起来如何: 我能想到的描述我想要实现的目标的最好方法是,应该移除周围像素完全透明的每个像素。将选择器视为3x3网格,网格的中间是操作的像素 我看了一下IM手册,但它似乎没有提供足够好的方法 使用ImageMagick可以实现这一点吗?如果没有,还有其他命令行软件可以实现这一点吗?在Imagemagick中,您可以使用连接的组件删除那些孤立的像素块。它们的侧面看起来是5x5像素。

你好我想从透明图像中删除所有出现的杂散像素

以下是为方便起见放大的示例图像:

以下是相同的图像,但我希望它在处理后看起来如何:

我能想到的描述我想要实现的目标的最好方法是,应该移除周围像素完全透明的每个像素。将选择器视为3x3网格,网格的中间是操作的像素

我看了一下IM手册,但它似乎没有提供足够好的方法


使用ImageMagick可以实现这一点吗?如果没有,还有其他命令行软件可以实现这一点吗?

在Imagemagick中,您可以使用连接的组件删除那些孤立的像素块。它们的侧面看起来是5x5像素。所以我们把面积限制在26。我们移除alpha通道中的那些块,然后替换图像中的块。(注意,我们需要使用8-连接与4-连接区域检测来保留其他区域)

因为你说你的图像放大了,所以我假设你的孤立区域是1x1像素。因此,将区域阈值更改为2,以删除单像素区域

输入:

Unix语法:

convert img.png \
\( -clone 0 -alpha extract -type bilevel \
-define connected-components:mean-color=true \
-define connected-components:area-threshold=26 \
-connected-components 8 \) \
-alpha off -compose copy_opacity -composite \
result.png

Windows语法:

convert img.png ^
( -clone 0 -alpha extract -type bilevel ^
-define connected-components:mean-color=true ^
-define connected-components:area-threshold=26 ^
-connected-components 8 ) ^
-alpha off -compose copy_opacity -composite ^
result.png

补充:

如果您只想删除小的独立颜色像素,而不想删除颜色像素中的任何透明像素,那么没有简单的方法可以做到这一点。这是我想要的增强。然而,这是可以做到的

这是修改后的图像,以便左上角的红色块有一个透明的中心像素。我在其右侧添加了一条红线,以确保当中心变为透明时,它大于25个像素,这样您就可以看到哪个像素具有透明的中心。您必须下载并放大此图像才能看到丢失的像素

4倍变焦:

该方法是找到alpha通道中的所有白色区域,然后列出小于26像素的所有区域。然后重新处理图像,按ID删除这些区域

获取ID列表

id_list=""
OLDIFS=$IFS
IFS=$'\n'
arr=(`convert img2.png -alpha extract -type bilevel \
-define connected-components:mean-color=true \
-define connected-components:verbose=true \
-connected-components 8 null: | grep "gray(255)" | sed 's/^[ ]*//'`)
echo "${arr[*]}"
num=${#arr[*]}
IFS=$OLDIFS
for ((i=0; i<num; i++)); do
id=`echo "${arr[$i]}" | cut -d' ' -f1 | sed 's/[:]*$//'`
count=`echo "${arr[$i]}" | cut -d' ' -f4`
if [ $count -lt 26 ]; then
id_list="$id_list $id"
fi
done
echo "$id_list"
重新处理以按ID删除区域

convert img2.png \
\( -clone 0 -alpha extract -type bilevel \
-define connected-components:mean-color=true \
-define connected-components:remove="$id_list" \
-connected-components 8 -background black -flatten +write tmp.png \) \
-alpha off -compose copy_opacity -composite \
result2.png

4倍变焦:


fmw42的优秀答案是使用连通区域,但我认为仅使用形态学是可能的。使用:

0 0 0 
0 1 0 
0 0 0 
作为腐蚀的结构元素,它将检测8路连接的孤立像素。现在用你的alpha提高分辨率,它会使这些像素完全透明(即移除它们)

我不太了解我,所以不能给你一个命令来做这件事:-(但是使用命令行可以制作一个测试图像:

size=256

# sparse speckles for the alpha
vips gaussnoise t1.v $size $size
vips relational_const t1.v a.v more 200

# RGB noise 
vips gaussnoise r.v $size $size
vips gaussnoise g.v $size $size
vips gaussnoise b.v $size $size

# assemble and save
vips bandjoin "r.v g.v b.v a.v" x.png
然后,要移除杂散像素,请执行以下操作:

# make mask.mor, a file containing our structuring element
cat >mask.mor <<EOF
3 3 
0   0   0
0   255 0
0   0   0
EOF

# pull out the alpha channel
vips extract_band x.png a.v 3

# find isolated pixels
vips morph a.v t1.v mask.mor erode

# EOR with alpha to zap those pixels
vips boolean t1.v a.v t2.v eor

# extract rgb from original, then attach our modified alpha
vips extract_band x.png rgb.v 0 --n 3
vips bandjoin "rgb.v t2.v" x2.png
#make mask.mor,一个包含我们的结构元素的文件

cat>mask.mor感谢您的回复,但是我无法复制您的结果。result.png输出为BW掩码,可能用于另一个magick命令。您知道为什么会发生这种情况吗?您的Imagemagick版本和平台是什么吗?我的代码是Unix语法。另外,请确保\.Windows之后没有空格,我担心相应地测试了语法,只删除了反斜杠和右括号。它执行时没有出现错误,但给出了上述意外结果。我想最坏的情况是,我在几年内第一次重新启动Ubuntu。请参阅我对Windows语法的回答中的更改。也请参阅有关在中调整大小的说明放置。另外,请按照我的要求提供您的IM版本。您可能使用的版本太旧。它至少需要6.8.9.10。如果在Imagemagick 7上,请将转换更改为magick。还要确保您使用的是Imagemagick convert,而不是windows convert。感谢您更新您的帖子,我使用的是v7.0.8.56。将立即编辑此评论并显示结果。ED它:你为Windows更新的语法工作得很好,将你的帖子标记为答案并投票。再次感谢!
# make mask.mor, a file containing our structuring element
cat >mask.mor <<EOF
3 3 
0   0   0
0   255 0
0   0   0
EOF

# pull out the alpha channel
vips extract_band x.png a.v 3

# find isolated pixels
vips morph a.v t1.v mask.mor erode

# EOR with alpha to zap those pixels
vips boolean t1.v a.v t2.v eor

# extract rgb from original, then attach our modified alpha
vips extract_band x.png rgb.v 0 --n 3
vips bandjoin "rgb.v t2.v" x2.png