Я хочу использовать фильтр изображения, который должен заменить пиксель, с которым он имеет дело, с самым высоким появлением соседей. Например, если пиксель имеет значение 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 различных значений серого не имеют логической связи.





Вы можете использовать модальный фильтр в беглый просмотр, пример здесь, документация здесь.
Или, если ваши потребности немного отличаются, вы можете поэкспериментировать с generic_filter() в острый (документация здесь) следующим образом:
#!/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, поэтому вы можете использовать OpenCVimage = imread(), а затем вызывать функции, которые я предлагаю выше, с этим изображением.
Ключевые слова: Python, PIL, Pillow, skimage, простой фильтр, общий фильтр, среднее значение, медиана, режим, изображение, обработка изображений, numpy
Спасибо! Как только я проверю это, я отмечу ваш ответ как решение :)