【发布时间】:2020-04-12 09:45:38
【问题描述】:
将 CIFilter 应用于图像时,我得到了意想不到的结果。预期的结果是黑白图像,橙色通过边缘混合。相反,我得到了一个蓝色的图像,边缘混合了红色。我的功能是:
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
}
以下是函数执行过程中每一步的图像:
这就是我应用具有 0 饱和度和 7x7 卷积的 CIColorControls 时的结果。我用它作为我的面具,试图通过黑色轮廓区域显示橙色。
这是使用 CIFilter "CIPhotoEffectNoir" 后的黑白,在将其与蒙版和纯色混合时用作输入图像。
执行 CIBlendWithMask 后生成的图像看起来不正确。
首先,我希望背景颜色仅出现在蒙版图像上的轮廓所在的位置。背景颜色是橙色而不是红色,输入图像是蓝色而不是严格的黑白。
【问题讨论】:
标签: swift mask cifilter ciimage