Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自适应阈值CIKernel/CIFilter iOS_Ios_Core Image_Cifilter_Adaptive Threshold_Cikernel - Fatal编程技术网

自适应阈值CIKernel/CIFilter iOS

自适应阈值CIKernel/CIFilter iOS,ios,core-image,cifilter,adaptive-threshold,cikernel,Ios,Core Image,Cifilter,Adaptive Threshold,Cikernel,为了找到在iOS上执行自适应阈值处理的内核,我进行了全面的研究。不幸的是,我不理解内核语言或其背后的逻辑。下面,我找到了一个执行阈值设置的例程() 是否可以将其重写为自适应阈值内核?我提供给它的图像已经变成黑白,并且已经模糊了。你能给我指点什么资源吗?我想坚持使用CoreImage,因为我的整个堆栈都是围绕它构建的 编辑:我试图实现的最佳示例/参考已在GPUImage的GPUImageAdaptiveThresholdFilter中实现-这看起来如何:我使用了CoreImageCIBoxBlur

为了找到在iOS上执行自适应阈值处理的内核,我进行了全面的研究。不幸的是,我不理解内核语言或其背后的逻辑。下面,我找到了一个执行阈值设置的例程()

是否可以将其重写为自适应阈值内核?我提供给它的图像已经变成黑白,并且已经模糊了。你能给我指点什么资源吗?我想坚持使用CoreImage,因为我的整个堆栈都是围绕它构建的


编辑:我试图实现的最佳示例/参考已在GPUImage的GPUImageAdaptiveThresholdFilter中实现-

这看起来如何:我使用了CoreImage
CIBoxBlur
(尽管专用卷积滤波器可能更快),并将其输出传递到我的系统中

我发现了一个阴影页,代码如下:

let page = CIImage(image: UIImage(named: "son1.gif")!)

let filter = AdaptiveThresholdFilter()

filter.inputImage = page

let final = filter.outputImage
我得到了这个结果:

干杯


Simon

Simon的过滤器是实现预期效果的正确方法,但是,您必须修改一些内容

首先,切换
imageLuma
thresholdLuma
的顺序,因为我们希望黑色字母保持黑色,而不是相反。另外,您应该添加一个常量(我选择了
0.01
)来消除噪声

    var thresholdKernel =  CIColorKernel(string:
    "kernel vec4 thresholdFilter(__sample image, __sample threshold)" +
        "{" +
        "   float imageLuma = dot(image.rgb, vec3(0.2126, 0.7152, 0.0722));" +
        "   float thresholdLuma = dot(threshold.rgb, vec3(0.2126, 0.7152, 0.0722));" +
        "   return vec4(vec3(step(thresholdLuma, imageLuma+0.001)), 1);"     
    "}"

override var outputImage: CIImage! {
    guard let inputImage = inputImage,
        let thresholdKernel = thresholdKernel else {
        return nil
    }
    let blurred = inputImage.applyingFilter("CIBoxBlur", withInputParameters: [kCIInputRadiusKey: 5]) // block size
    let extent = inputImage.extent
    let arguments = [inputImage, blurred]
    return thresholdKernel.apply(withExtent: extent, arguments: arguments)
}
这就是,您只需使用苹果的核心映像,而无需安装任何外部库即可获得的功能:)


当然,您可以使用常量和块大小的值进行一些操作。

您可以使用
CIColorThresholdOtsu
核心图像过滤器

谢谢您让我开始学习。我一直在寻找更多关于howeverPascal的东西,谢谢你的回答。关于如何在CoreImage中实现这一点,你有什么想法吗?你提到常数是0.01,但你有0.001,这是错误的吗?另外,您是将该常数应用于imageLuma还是阈值luma(假设我确实想要黑色背景的白色字母。0.01和0.001似乎没有太大区别。你可以尝试不同的值来满足你的需要。我用描述、金属和现代方法更新了我的代码,我用下面的代码启发自己,但下面的代码不尊重alpha预乘。)(透明区域将变为黑色或白色)。这个最新的答案也非常有用!如果开发人员编写了一个阈值算法,只想应用阈值,那么CIColorThreshold也值得一看:
let page = CIImage(image: UIImage(named: "son1.gif")!)

let filter = AdaptiveThresholdFilter()

filter.inputImage = page

let final = filter.outputImage
    var thresholdKernel =  CIColorKernel(string:
    "kernel vec4 thresholdFilter(__sample image, __sample threshold)" +
        "{" +
        "   float imageLuma = dot(image.rgb, vec3(0.2126, 0.7152, 0.0722));" +
        "   float thresholdLuma = dot(threshold.rgb, vec3(0.2126, 0.7152, 0.0722));" +
        "   return vec4(vec3(step(thresholdLuma, imageLuma+0.001)), 1);"     
    "}"

override var outputImage: CIImage! {
    guard let inputImage = inputImage,
        let thresholdKernel = thresholdKernel else {
        return nil
    }
    let blurred = inputImage.applyingFilter("CIBoxBlur", withInputParameters: [kCIInputRadiusKey: 5]) // block size
    let extent = inputImage.extent
    let arguments = [inputImage, blurred]
    return thresholdKernel.apply(withExtent: extent, arguments: arguments)
}