Я использую cvFilter2D
для фильтрации изображений.В документации написано:
Когда апертура частично находится вне изображения, функция интерполирует значения пикселей выбросов из ближайших пикселей, находящихся внутри изображения.
Несмотря на то, что в большинстве случаев такая экстраполяция в порядке, я хочу обработать такие значения пикселей выброса с помощью заполнение нулями (вот пример 1D того, что это значит).
Вот способ, которым я сейчас занимаюсь:
def do_filter(im, filt):
N, M = cv.GetSize(filt)
_, _, width, height = cv.GetImageROI(im)
padded = cv.CreateImage((width + N, height + M), im.depth, im.nChannels)
cv.SetZero(padded)
roi = (N/2, M/2, width, height)
cv.SetImageROI(padded, roi)
cv.Copy(im, padded)
cv.ResetImageROI(padded)
cv.Filter2D(padded, padded, filt)
result = cv.CreateImage(cv.GetSize(im), im.depth, im.nChannels)
cv.SetImageROI(padded, roi)
cv.Copy(padded, result)
return result
В основном:
- Создание дополненного изображения и копирование содержимого из ввода
- Фильтр
- Обрезать мягкие области
Мне это не нравится, потому что мне приходится много работать, просто перемещая пиксели вокруг.Это медленно.
Есть ли лучший способ сделать заполнение нулями при фильтрации?
РЕДАКТИРОВАТЬ
Я нашел cvCopyMakeBorder немного чище, но все же копирует изображение и, следовательно, медленно.
РЕДАКТИРОВАТЬ 2
cv :: filter2D в C ++API это делает.Я хотел бы знать, имеет ли где-то старый API C такую же функциональность (я не могу получить доступ к API C ++ из Python, но могу получить доступ к API C из Python).