Я получаю неожиданные результаты при применении фильтров CIFilters к изображению. Ожидаемый результат - черно-белое изображение с переходом оранжевого цвета по краям. Вместо этого я получаю синее изображение с красным переходом по краям. Моя функция:
func sketch(with ciImage: CIImage) -> CIImage {
var sourceCore = ciImage
var convolutionValue_A:CGFloat = -0.0925937220454216
var convolutionValue_B:CGFloat = -0.4166666567325592
var convolutionValue_C:CGFloat = -1.8518532514572144
var convolutionValue_D:CGFloat = 0.23148006200790405
var convolutionValue_E:CGFloat = 4.5833334922790527
var convolutionValue_F:CGFloat = 14.166666984558105
var brightnessVal:CGFloat = 1.1041666269302368
var contrastVal:CGFloat = 3.0555555820465088
var weightsArr: [CGFloat] = [
convolutionValue_A, convolutionValue_A, convolutionValue_B, convolutionValue_B, convolutionValue_B, convolutionValue_A, convolutionValue_A,
convolutionValue_A, convolutionValue_B, convolutionValue_C, convolutionValue_C, convolutionValue_C, convolutionValue_B, convolutionValue_A,
convolutionValue_B, convolutionValue_C, convolutionValue_D, convolutionValue_E, convolutionValue_D, convolutionValue_C, convolutionValue_B,
convolutionValue_B, convolutionValue_C, convolutionValue_E, convolutionValue_F, convolutionValue_E, convolutionValue_C, convolutionValue_B,
convolutionValue_B, convolutionValue_C, convolutionValue_D, convolutionValue_E, convolutionValue_D, convolutionValue_C, convolutionValue_B,
convolutionValue_A, convolutionValue_B, convolutionValue_C, convolutionValue_C, convolutionValue_C, convolutionValue_B, convolutionValue_A,
convolutionValue_A, convolutionValue_A, convolutionValue_B, convolutionValue_B, convolutionValue_B, convolutionValue_A, convolutionValue_A
]
let inputWeights:CIVector = CIVector(values: weightsArr, count: weightsArr.count)
sourceCore = sourceCore
.applyingFilter("CIColorControls", parameters: [kCIInputImageKey: sourceCore,
kCIInputSaturationKey: 0.0,
kCIInputBrightnessKey: brightnessVal,
kCIInputContrastKey: contrastVal])
// transforms image to only show edges in black and white
sourceCore = sourceCore
.applyingFilter("CIConvolution7X7", parameters: [kCIInputImageKey: sourceCore,
kCIInputWeightsKey: inputWeights]).cropped(to: sourceCore.extent)
// give camera image a black and white Noir effect
var ciImage = ciImage
.applyingFilter("CIPhotoEffectNoir", parameters: [kCIInputImageKey: ciImage])
// make solid color
let color = CIColor(red: 0.819, green: 0.309, blue: 0.309)
let colFilter = CIFilter(name: "CIConstantColorGenerator")!
colFilter.setValue(color, forKey: kCIInputColorKey)
var solidColor = colFilter.value(forKey: "outputImage") as! CIImage
solidColor = solidColor.cropped(to: ciImage.extent)
// color should only be shown through outlines
// for some reason the input image is blue-ish
sourceCore = sourceCore
.applyingFilter("CIBlendWithMask", parameters: [
kCIInputImageKey: ciImage, // black and white image
kCIInputBackgroundImageKey: solidColor, // solid color
kCIInputMaskImageKey:sourceCore]) // edge work image
ciImage = sourceCore
return ciImage
}
Вот изображения на каждом этапе работы функции:
Мое исходное полноцветное изображение
Вот что получается, когда я применяю CIColorControls с 0 насыщенностью и сверткой 7x7. Я использую это для своей маски, чтобы попытаться показать оранжевый цвет через черные области контура.
Это черно-белое изображение после использования CIFilter «CIPhotoEffectNoir», которое используется в качестве входного изображения при смешивании его с маской и сплошным цветом.
Сплошной оранжевый цвет, который я использую в качестве фона при смешивании с маской.
Изображение, полученное после выполнения CIBlendWithMask, выглядит некорректно.
Прежде всего, я бы ожидал, что цвет фона появится только там, где контуры находятся на изображении маски. Там, где установлен цвет фона, он выглядит оранжевым, а не красным, а входное изображение синее, а не строго черно-белое.