首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自适应门限CIKernel/CIFilter iOS

自适应门限CIKernel/CIFilter iOS
EN

Stack Overflow用户
提问于 2016-03-23 16:55:41
回答 3查看 4.1K关注 0票数 8

为了找到一个在iOS上进行自适应阈值处理的内核,我对其进行了深入的研究。不幸的是,我不理解内核语言或它背后的逻辑。下面,我找到了一个执行阈值处理的例程(https://gist.github.com/xhruso00/a3f8a9c8ae7e33b8b23d)

代码语言:javascript
复制
static NSString * const kKernelSource = @"kernel vec4 thresholdKernel(sampler image)\n"
"{\n"
"  float inputThreshold = 0.05;\n"
"  float pass = 1.0;\n"
"  float fail = 0.0;\n"
"  const vec4   vec_Y = vec4( 0.299, 0.587, 0.114, 0.0 );\n"
"  vec4  src = unpremultiply( sample(image, samplerCoord(image)) );\n"
"  float Y = dot( src, vec_Y );\n"
"  src.rgb = vec3( compare( Y - inputThreshold, fail, pass));\n"
"  return premultiply(src);\n"
"}";

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

编辑:我试图实现的最好的例子/参考已经在GPUImage的GPUImageAdaptiveThresholdFilter - https://github.com/BradLarson/GPUImage/blob/c5f0914152419437869c35e29858773b1a06083c/framework/Source/GPUImageAdaptiveThresholdFilter.m中实现了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-22 13:40:57

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

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

代码语言:javascript
复制
    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)
}

这就是,您只需要使用Apple的Core Image,而不必安装任何外部库:)

当然,您可以使用常量和块大小的值。

票数 5
EN

Stack Overflow用户

发布于 2016-03-23 18:34:55

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

代码语言:javascript
复制
class AdaptiveThresholdFilter: CIFilter
{
    var inputImage : CIImage?


    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(imageLuma, thresholdLuma)), 1.0);" +
    "}"
    )


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

        let blurred = inputImage.imageByApplyingFilter("CIBoxBlur",
               withInputParameters: [kCIInputRadiusKey: 9])

        let extent = inputImage.extent
        let arguments = [inputImage, blurred]

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

我找到了一个有阴影的页面的这幅图像,并使用以下代码:

代码语言:javascript
复制
let page = CIImage(image: UIImage(named: "son1.gif")!)

let filter = AdaptiveThresholdFilter()

filter.inputImage = page

let final = filter.outputImage

我得到了这个结果:

干杯!

西蒙

票数 6
EN

Stack Overflow用户

发布于 2020-11-03 10:44:47

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36184255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档