如何在 CIImage 上应用 CIEdgePreserveUpsampleFilter?
How to apply CIEdgePreserveUpsampleFilter on CIImage?
我正在关注 this WWDC 讲座。
在讲座中,他提到了一个名为 "CIEdgePreserveUpsampleFilter" 的过滤器,它使边缘更加保留和上采样。
我试图在我的 CIImage 上应用它,但我得到了图像的未初始化结果并崩溃。
这是我正在使用的代码以及我如何尝试应用过滤器的示例(这显然是错误的)。我只是找不到任何应用此滤镜的相关说明,我只知道我希望它的结果出现在我的图像上。
我在我尝试应用过滤器的位置旁边评论,以及当我这样做时会发生什么。
func createMask(for depthImage: CIImage, withFocus focus: CGFloat, andScale scale: CGFloat, andSlope slope: CGFloat = 4.0, andWidth width: CGFloat = 0.1) -> CIImage {
let s1 = slope
let s2 = -slope
let filterWidth = 2 / slope + width
let b1 = -s1 * (focus - filterWidth / 2)
let b2 = -s2 * (focus + filterWidth / 2)
let mask0 = depthImage
.applyingFilter("CIColorMatrix", withInputParameters: [
"inputRVector": CIVector(x: s1, y: 0, z: 0, w: 0),
"inputGVector": CIVector(x: 0, y: s1, z: 0, w: 0),
"inputBVector": CIVector(x: 0, y: 0, z: s1, w: 0),
"inputBiasVector": CIVector(x: b1, y: b1, z: b1, w: 0)])
.applyingFilter("CIColorClamp").applyingFilter("CIEdgePreserveUpsampleFilter") //returns uninitialized image
let mask1 = depthImage
.applyingFilter("CIColorMatrix", withInputParameters: [
"inputRVector": CIVector(x: s2, y: 0, z: 0, w: 0),
"inputGVector": CIVector(x: 0, y: s2, z: 0, w: 0),
"inputBVector": CIVector(x: 0, y: 0, z: s2, w: 0),
"inputBiasVector": CIVector(x: b2, y: b2, z: b2, w: 0)])
.applyingFilter("CIColorClamp")
var combinedMask = mask0.applyingFilter("CIEdgePreserveUpsampleFilter", withInputParameters: ["inputBackgroundImage" : mask1]) //complete crash
if PortraitModel.sharedInstance.filterArea == .front {
combinedMask = combinedMask.applyingFilter("CIColorInvert")
}
let mask = combinedMask.applyingFilter("CIBicubicScaleTransform", withInputParameters: [kCIInputScaleKey: scale])
return mask
}
运行时 headers 和我发现的一些使用代码似乎表明 CIEdgePreserveUpsampleFilter 不采用 inputBackgroundImage
参数,而是 inputSmallImage
。
见https://gist.github.com/HarshilShah/ca0e18db01ce250fd308ab5acc99a9d0
我正在关注 this WWDC 讲座。
在讲座中,他提到了一个名为 "CIEdgePreserveUpsampleFilter" 的过滤器,它使边缘更加保留和上采样。 我试图在我的 CIImage 上应用它,但我得到了图像的未初始化结果并崩溃。
这是我正在使用的代码以及我如何尝试应用过滤器的示例(这显然是错误的)。我只是找不到任何应用此滤镜的相关说明,我只知道我希望它的结果出现在我的图像上。 我在我尝试应用过滤器的位置旁边评论,以及当我这样做时会发生什么。
func createMask(for depthImage: CIImage, withFocus focus: CGFloat, andScale scale: CGFloat, andSlope slope: CGFloat = 4.0, andWidth width: CGFloat = 0.1) -> CIImage {
let s1 = slope
let s2 = -slope
let filterWidth = 2 / slope + width
let b1 = -s1 * (focus - filterWidth / 2)
let b2 = -s2 * (focus + filterWidth / 2)
let mask0 = depthImage
.applyingFilter("CIColorMatrix", withInputParameters: [
"inputRVector": CIVector(x: s1, y: 0, z: 0, w: 0),
"inputGVector": CIVector(x: 0, y: s1, z: 0, w: 0),
"inputBVector": CIVector(x: 0, y: 0, z: s1, w: 0),
"inputBiasVector": CIVector(x: b1, y: b1, z: b1, w: 0)])
.applyingFilter("CIColorClamp").applyingFilter("CIEdgePreserveUpsampleFilter") //returns uninitialized image
let mask1 = depthImage
.applyingFilter("CIColorMatrix", withInputParameters: [
"inputRVector": CIVector(x: s2, y: 0, z: 0, w: 0),
"inputGVector": CIVector(x: 0, y: s2, z: 0, w: 0),
"inputBVector": CIVector(x: 0, y: 0, z: s2, w: 0),
"inputBiasVector": CIVector(x: b2, y: b2, z: b2, w: 0)])
.applyingFilter("CIColorClamp")
var combinedMask = mask0.applyingFilter("CIEdgePreserveUpsampleFilter", withInputParameters: ["inputBackgroundImage" : mask1]) //complete crash
if PortraitModel.sharedInstance.filterArea == .front {
combinedMask = combinedMask.applyingFilter("CIColorInvert")
}
let mask = combinedMask.applyingFilter("CIBicubicScaleTransform", withInputParameters: [kCIInputScaleKey: scale])
return mask
}
运行时 headers 和我发现的一些使用代码似乎表明 CIEdgePreserveUpsampleFilter 不采用 inputBackgroundImage
参数,而是 inputSmallImage
。
见https://gist.github.com/HarshilShah/ca0e18db01ce250fd308ab5acc99a9d0