Фильтр изображения, который использует наибольшее вхождение значений пикселей - PullRequest
0 голосов
/ 30 января 2019

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

1 Ответ

0 голосов
/ 30 января 2019

Вы можете использовать модальный фильтр в skimage , пример здесь , документация здесь .


Или, если ваши потребности отличаютсянемного, вы можете поэкспериментировать с generic_filter() in scipy (документация здесь ) по следующим направлениям:

#!/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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...