Понимание выходного расширения ядер свертки при смешивании

Я хочу обработать изображение с пользовательской сверткой на основе металла CIKernel и смешать результат с другими изображениями в одну композицию. Но я наблюдаю странное поведение отсечения во время смешивания:

Чтобы проиллюстрировать это, я создал простую композицию примерно так:

let inputImage = CIImage(image: inputImage)
let filter = MyCustomFilter()
filter.setValue(inputImage, forKey: kCIInputImageKey)
let filteredImage = filter.outputImage!.transformed(by: .init(translationX: 360, y: 300))
let background = CIImage(color: .white).cropped(to: CGRect(origin: .zero, size: CGSize(width: 1500, height: 1000)))

let composedImage = filteredImage.composited(over: background)

когда MyCustomFilter ничего не делает (return src.sample(src.coord())), результат выглядит так: 

Теперь, если я выполню фактическую свертку (пример пикселей вокруг среднего пикселя) в фильтре, так

float4 testKernel(sampler src, destination dest) {
    return src.sample(src.transform(dest.coord() + float2(1,1)));
}

результат неожиданно выглядит так:

Как вы можете видеть, к изображению при смешивании неожиданно добавляется поведение зажима к расширению, хотя его расширение все равно inputImage,

Я заметил, что сверточные фильтры Apple возвращают большее выходное изображение, которое также содержит область ореола в зависимости от параметров фильтра. Поэтому я много поиграл и обнаружил, что если я скажу ядру рендерить в большее расширение и затем обрезать его, смешивание снова будет работать, как и ожидалось:

let output = self.kernel.apply(extent: inputExtent.insetBy(dx: -1, dy: -1),
                          roiCallback: roiCallback,
                            arguments: [inputImage])
return output.cropped(to: inputExtent)

Кажется, фильтр наложения каким-то образом пытается выбрать пиксели за пределами экстента изображения, чтобы определить, как заполнить пустое пространство. Это должно быть прозрачным по умолчанию, но, по-видимому, сама операция свертки добавляет некоторое поведение зажима к краю, даже если я не изменяю экстент результата.

Кто-нибудь знает, если это ошибка и / или каков наилучший подход к объединению пользовательских фильтров свертки с композициями?

0 ответов

Другие вопросы по тегам