Filter ImageMagick:自定义排名过滤器?如侵蚀、扩张或中位数,但等级不同,如a';百分位数';过滤器?

Filter ImageMagick:自定义排名过滤器?如侵蚀、扩张或中位数,但等级不同,如a';百分位数';过滤器?,filter,imagemagick,pixel,rank,median,Filter,Imagemagick,Pixel,Rank,Median,当对ImageMagick应用秩过滤器(如腐蚀、delate或中值)时,它会取每个源像素周围特定半径或自定义形状内所有像素的最小值(腐蚀)或最大值(放大)或中间值(中值) 也可以对周围的像素值进行自定义排序吗?例如,使用5x5正方形时,使用腐蚀或扩张或中值过滤器,分别取每个像素周围25个像素中间值的最低值和最高值。我要找的是一种方法,以第8个或第23个值为例 也许这可以表示为百分位,例如,取每个像素周围任意区域的20%百分位值。如果是7x7平方,则为0.2*7*7=顺序总数49中的第9个值 侵蚀

当对ImageMagick应用秩过滤器(如腐蚀、delate或中值)时,它会取每个源像素周围特定半径或自定义形状内所有像素的最小值(
腐蚀
)或最大值(
放大
)或中间值(
中值

也可以对周围的像素值进行自定义排序吗?例如,使用5x5正方形时,使用
腐蚀
扩张
中值
过滤器,分别取每个像素周围25个像素中间值的最低值和最高值。我要找的是一种方法,以第8个或第23个值为例

也许这可以表示为百分位,例如,取每个像素周围任意区域的20%百分位值。如果是7x7平方,则为0.2*7*7=顺序总数49中的第9个值


侵蚀
扩张
中值
过滤器分别对应于0%、100%和50%的百分位数

除了在您自己的“流程模块”中编译之外,我想不出一种在ImageMagick中轻松实现这一点的方法。最好的介绍是通过
snibgo
,实际上是针对Windows-请参见
sortpixels.c
示例


一个可以简单地从命令行执行此操作的工具是它的
im\u rank()
函数

因此,如果您想从5x5个邻居的排序列表中获得索引8,可以执行以下操作:

vips im_rank input.png result.png 5 5 8
我用ImageMagick生成一个随机图像,然后依次为
index
选择更大的值,然后输出图像依次变亮,这就是我测试的总和。我没有理由相信它不会起作用——它是一个优秀的图书馆,而且非常快速和节俭


如果您可以使用Python,您可以这样做:

#!/usr/bin/env python3

import numpy as np
from PIL import Image
from scipy.ndimage import generic_filter
from scipy import stats

# Modal filter
def modal(P):
    """
    We receive P[0]..P[8] with the pixels in the 3x3 surrounding window
    Sort neighbours and take N'th in list
    """
    N = 3
    P.sort()
    return P[N]

# Open image and make into Numpy array
im = Image.open('image.png').convert('L')
im = np.array(im)

# Run modal filter, change filter size here
result = generic_filter(im, modal, (3, 3))

# Save result
Image.fromarray(result).save('result.png')
通过更改此行,可以将过滤器大小/形状更改为5x5:

result = generic_filter(im, modal, (5, 5))
事实上,它需要第三个最小的邻居,因为计数从0开始。因此,如果希望在3x3邻域中获得最小值,请使用
N=0
;如果希望在3x3邻域中获得最大值,请使用
N=8


另一个选项可能是使用简单的使用头文件C++库(没有DLLS/LIbxx.a/LixXX..SO文件),可以在不需要任何外部的情况下实际地读取和写入PGM文件。因此,您可以运行ImageMagick命令,使其在

stdout
上写入PGM文件,并在使用CImg时读取该文件,对其进行处理,然后再次将其写出。这可能比编写一个ImageMagick“流程模块”更容易,而且您不需要为每个版本重新从源代码构建ImageMagick


关键词:ImageMagick、VIP、LibVIP、过滤器、排名、排名、中位数、放大、腐蚀、窗口、3x3、5x5、NxN、百分位、Python、PIL、枕头、图像、图像处理。

如果您愿意再看一看,我更新了我的答案。