gpt4 book ai didi

ios - 如何使用 CoreImage 创建平滑的阈值过滤器?

转载 作者:可可西里 更新时间:2023-11-01 06:22:47 25 4
gpt4 key购买 nike

是否存在可用作平滑阈值的现有过滤器?我的意思是像素值应该在两个值之间设置阈值,但中间值是插值的。

基本上,我正在尝试实现这个:

https://www.filterforge.com/wiki/index.php/Thresholds#Interpolation_.28.22Blending.22.29

最佳答案

您需要使用 Core Image Kernel Language 和 CIColorKernel 编写自己的代码。

我会使用smoothstep 并传入两个边缘值以及当前像素的亮度。 CIKL 可能看起来像这样:

kernel vec4 color(__sample pixel, float inputEdgeO, float inputEdge1)
{
float luma = dot(pixel.rgb, vec3(0.2126, 0.7152, 0.0722));
float threshold = smoothstep(inputEdgeO, inputEdge1, luma);
return vec4(threshold, threshold, threshold, 1.0);
}

您可以使用以下代码将其包装到 CIFilter 中:

class SmoothThreshold: CIFilter
{
var inputImage : CIImage?
var inputEdgeO: CGFloat = 0.25
var inputEdge1: CGFloat = 0.75

var colorKernel = CIColorKernel(string:
"kernel vec4 color(__sample pixel, float inputEdgeO, float inputEdge1)" +
"{" +
" float luma = dot(pixel.rgb, vec3(0.2126, 0.7152, 0.0722));" +
" float threshold = smoothstep(inputEdgeO, inputEdge1, luma);" +
" return vec4(threshold, threshold, threshold, 1.0);" +
"}"
)

override var outputImage: CIImage!
{
guard let inputImage = inputImage,
colorKernel = colorKernel else
{
return nil
}

let extent = inputImage.extent
let arguments = [inputImage,
inputEdgeO,
inputEdge1]

return colorKernel.applyWithExtent(extent,
arguments: arguments)
}
}

请注意,您需要确保 inputEdge0 小于 inputEdge1,否则 smoothstep 会有点疯狂。您可能还想对它们进行饱和,以确保它们介于 0 和 1 之间。

看看 CIFilter.registerFilterName,它可以让您使用熟悉的语法创建 SmoothThreshold 的实例,尽管这样可以正常工作:

let image = CIImage(image: UIImage(named: "monalisa.jpg")!)!

let filter = SmoothThreshold()
filter.inputImage = image

let final = filter.outputImage

干杯!

西蒙

关于ios - 如何使用 CoreImage 创建平滑的阈值过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36287861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com