图像过滤器使用最高出现的像素值

问题描述 投票:1回答:1

我想使用一个图像过滤器,它应该替换它处理的像素与邻居的最高出现率。例如,如果像素具有值10,并且8个邻居具有9,9,9,27,27,200,200,210,那么它应该选择9,因为9在邻域中​​具有最高出现率。它也应该考虑像素本身。因此,例如,如果像素具有值27并且8个邻居具有27,27,30,30,34,70,120,120那么它应该选择27,因为27有3次,包括像素本身。我也应该可以选择内核的大小。我没有找到这样的过滤器。有吗?或者我必须自己创建它?我用opencv和python。

背景信息:我不能只使用中位数滤镜,因为我的图像不同。我有灰色图像,有3到6个不同的灰度值。因此,我不能使用一些形态转换。我没有得到我想要的结果。中值滤波器将选择中值,因为想法是值以正确的方式表示图像。但我的图像是kmeans的结果,3-6个不同的灰度值没有逻辑连接。

python-3.x image opencv imagefilter image-editing
1个回答
2
投票

您可以在skimage中使用模态过滤器,例如here,文档here


或者,如果您的需求略有不同,您可以沿着以下几行尝试使用scipy(文档generic_filter())中的here

#!/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"""
    mode = stats.mode(P)
    return mode.mode[0]

# Open image and make into Numpy array - or use OpenCV 'imread()'
im = Image.open('start.png').convert('L')
im = np.array(im)

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

# Save result or use OpenCV 'imwrite()'
Image.fromarray(result).save('result.png')

请注意,OpenCV图像可以与Numpy数组完全互换,因此您可以使用OpenCV image = imread(),然后使用该图像调用我建议的函数。

关键词:Python,PIL,Pillow,skimage,简单过滤器,通用过滤器,均值,中位数,模式,图像,图像处理,numpy

© www.soinside.com 2019 - 2024. All rights reserved.