Понимание выходного расширения ядер свертки при смешивании
Я хочу обработать изображение с пользовательской сверткой на основе металла 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)
Кажется, фильтр наложения каким-то образом пытается выбрать пиксели за пределами экстента изображения, чтобы определить, как заполнить пустое пространство. Это должно быть прозрачным по умолчанию, но, по-видимому, сама операция свертки добавляет некоторое поведение зажима к краю, даже если я не изменяю экстент результата.
Кто-нибудь знает, если это ошибка и / или каков наилучший подход к объединению пользовательских фильтров свертки с композициями?