【问题标题】:Filter Pixels in Image by Color Swift通过 Color Swift 过滤图像中的像素
【发布时间】:2018-12-08 17:13:59
【问题描述】:

我的项目正在使用 Vision 来识别视野中的某个矩形。我知道这个矩形将具有某种颜色。在 OpenCV 中,有一个过滤器允许您按颜色过滤像素,如 here 所示。

我是 CoreImage 框架的新手,但我看不到任何可以实现此目标的过滤器。是否有某种内置过滤器(不一定必须在 CoreImage 中),或者我需要学习如何编写自己的过滤器?

【问题讨论】:

  • 我不认为有一个内置的过滤器(当然,我可能是错的)。根据您的链接示例,我认为像 CIColorCube 这样的东西不会接近您想要的。但是构建一个简单的CIColorKernel 可能会成功。将输入颜色传递给它(如果您需要 ROI,请将其设为 CIKernel),您可以 (a) 识别您正在寻找的 准确 颜色,并且 (b) 有一个“感兴趣的区域” "或投资回报率。您是否正在寻找与您的链接相似的输出? (黑色,除非它是 ROI 内的颜色?)

标签: ios swift core-image apple-vision


【解决方案1】:

目标

我可以从给定链接下的信息中了解到,您希望将红色区域过滤为白色,将所有其他区域过滤为黑色。

为此,可以使用 CIColorKernel。

CIColorKernel

基于 GPU 的图像处理例程,仅处理图像中的颜色信息,用于创建自定义核心图像过滤器。

https://developer.apple.com/documentation/coreimage/cicolorkernel

截图

这里是一个带有难看背景颜色的屏幕截图,以便更好地查看图像覆盖的区域。

在上部区域显示输入图像。生成的图像显示在下部区域。

来源

import UIKit
import CoreImage

class ViewController: UIViewController {
    @IBOutlet weak var upperImageView: UIImageView!
    @IBOutlet weak var lowerImageView: UIImageView!


    let kernelString =
        """
        kernel vec4 thresholdFilter(__sample textureColor) {

            if (textureColor.r > 0.8 && textureColor.g < 0.1 && textureColor.b < 0.1) {
                textureColor.rgb = vec3(1.0, 1.0, 1.0);
            } else {
                textureColor.rgb = vec3(0.0, 0.0, 0.0);
            }

            return textureColor;
        }
        """

    let kernel: CIColorKernel

    required init?(coder aDecoder: NSCoder) {
        self.kernel = CIColorKernel(source: kernelString)!
        super.init(coder: aDecoder)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.upperImageView.image = UIImage(named: "example.png")
    }


    @IBAction func onFilter(_ sender: Any) {
        guard let inputImage = upperImageView.image else { return }
        guard let ciInputImage = CIImage(image: inputImage) else { return }

        let ciImageFiltered = self.kernel.apply(
            extent: ciInputImage.extent,
            arguments: [ciInputImage])

        let filteredImage = UIImage(ciImage: ciImageFiltered!)
        self.lowerImageView.image = filteredImage
    }
}

这就是你要找的吗?

【讨论】:

  • 是的,感谢您的描述性回答!有没有办法用 HSV 或只有 RGB 来做到这一点?
  • 也许是一个起点:在我的回答中:stackoverflow.com/a/50569196/2331445 我链接了一些 HSL 例程(不是我写的)。
猜你喜欢
  • 2015-11-11
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多