gpt4 book ai didi

swift - 在 swift 中使用 CIImage 过滤器控制黑白着色

转载 作者:行者123 更新时间:2023-11-28 07:27:04 24 4
gpt4 key购买 nike

我的代码将彩色 NSImage 转换为灰度。然后它将灰度转换为纯黑白图像。有没有办法创建一个可以指定如何将灰色像素转换为黑色/白色的过滤器?例如 -1.如果像素值> 100,将其变为黑色。2. 否则将像素变为白色。

我可以使用哪些过滤器设置来实现这一目标?

更新了 CIKernel 自定义过滤器:

func applyCustomCIFilter( path: String )->NSImage{
let url = URL(fileURLWithPath: path)
let origImage = CIImage(contentsOf: url)!

// Convert image into grayscale
let grayImage = CIFilter(name: "CIPhotoEffectNoir", parameters: [kCIInputImageKey: origImage])?.outputImage
print("convert into black and white")

// custom filter to convert light gray to white and dark gray to black
let replaceGrayKernel = CIColorKernel( source:
"kernel vec4 replaceGrayWithBlackOrWhite(sampler grayImage) {" +
"if( sample(grayImage, samplerCoord(grayImage)).rgb > 0.7 ){" +
"return vec4(0.0,0.0,0.0,1.0);" +
"}" +
"else" +
"{" +
"return vec4(1.0,1.0,1.0,1.0);" +
"}" +
"}"
)

//Apply custom filter to grayscale image.
//ERROR: blackAndWhiteImage is nil causing runtime failure
let blackAndWhiteImage = replaceGrayKernel?.apply(extent: (grayImage!.extent), arguments: [grayImage as Any])

//Convert CIImage to NSImage
let rep = NSCIImageRep(ciImage: blackAndWhiteImage!)
let nsImage = NSImage(size: rep.size)
nsImage.addRepresentation(rep)

return nsImage;
}

最佳答案

您的内核代码中有 2 个错误。这是正确的代码:

let kernel = CIColorKernel( source:
"kernel vec4 replaceGrayWithBlackOrWhite(__sample s) {" +
"if (s.r > 0.25 && s.g > 0.25 && s.b > 0.25) {" +
" return vec4(0.0,0.0,0.0,1.0);" +
"} else {" +
" return vec4(1.0,1.0,1.0,1.0);" +
"}" +
"}"
)
  • sampler__ sample 的变化是因为 CIColorKernel,它针对一次处理一个像素进行了优化,只是将那个像素传递给内核。因此,也不需要调用 sample(samplerCoord())CIWarpKernelCIKernel 使用 sampler,当您向内核发送一个 RIO(感兴趣区域)时,这些内核可以访问周围的像素。 .想想模糊效果。

  • 第二个变化是 if 语句。 if (s.rgb > 0.7)vec3(或三个 float )与单个 float 进行比较。一旦我纠正了这些值并认为 (a) 使用 AND (&&) 或 OR (||) 以及 (b) 降低将阈值设置为 0.25 可获得更接近的黑白图像。亲自尝试一下,看看您想要什么。

我创建了一个 small Swift 5 project (使用硬编码图像)使用此内核。

其中没有注释,它包含各种扩展(和 GLKView 的子类),因为我从一个生产项目中收集了一些东西。除了关注您的内核代码问题外,还有一个关于代码的警告词 - 它包含几个强制解包,应该为“生产就绪”代码删除。

关于swift - 在 swift 中使用 CIImage 过滤器控制黑白着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56284277/

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