Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.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
Ios 按颜色过滤图像中的像素_Ios_Swift_Core Image_Apple Vision - Fatal编程技术网

Ios 按颜色过滤图像中的像素

Ios 按颜色过滤图像中的像素,ios,swift,core-image,apple-vision,Ios,Swift,Core Image,Apple Vision,我的项目是使用视觉识别视野中的某个矩形。我知道这个长方形会有某种颜色。在OpenCV中,有一个过滤器,允许您按颜色过滤像素,如图所示 我是CoreImage框架的新手,但我看不到任何可以实现此目标的过滤器。是否有某种内置过滤器(不一定要在CoreImage中),或者我需要学习如何编写自己的过滤器?目标 我从给定链接下的信息中了解到,您希望将红色区域过滤为白色,将所有其他区域过滤为黑色 为此,可以使用CIColorKernel CIColorKernel 一种基于GPU的图像处理例行程序,仅处理图

我的项目是使用视觉识别视野中的某个矩形。我知道这个长方形会有某种颜色。在OpenCV中,有一个过滤器,允许您按颜色过滤像素,如图所示

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

目标

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

为此,可以使用CIColorKernel

CIColorKernel

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

屏幕截图

这里是一个背景颜色难看的屏幕截图,可以更好地看到图像覆盖的区域

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

来源

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
    }
}
导入UIKit
导入CoreImage
类ViewController:UIViewController{
@iBImageView:UIImageView!
@iBlowVar lowerImageView:UIImageView!
让内核字符串=
"""
内核vec4阈值过滤器(u样本纹理颜色){
如果(textureColor.r>0.8&&textureColor.g<0.1&&textureColor.b<0.1){
textureColor.rgb=vec3(1.0,1.0,1.0);
}否则{
textureColor.rgb=vec3(0.0,0.0,0.0);
}
返回纹理颜色;
}
"""
let内核:CIColorKernel
必需的初始化?(编码器aDecoder:NSCoder){
self.kernel=CIColorKernel(源代码:kernelString)!
super.init(编码者:aDecoder)
}
重写func viewDidLoad(){
super.viewDidLoad()
self.upperImageView.image=UIImage(名为:“example.png”)
}
@iAction func onFilter(\发送方:任意){
guard let inputImage=upperImageView.image else{return}
guard let ciInputImage=CIImage(image:inputImage)else{return}
让ciImageFiltered=self.kernel.apply(
范围:ciInputImage.extent,
参数:[ciInputImage])
让filteredImage=UIImage(ciImage:ciImageFiltered!)
self.lowerImageView.image=filteredImage
}
}

这就是你想要的吗?

我认为没有内置的过滤器(当然,我可能是错的)。根据您的链接示例,我认为像
CIColorCube
这样的东西不会达到您想要的效果。但是构建一个简单的
CIColorKernel
可能会奏效。将输入颜色传递给它(如果您需要ROI,将其设置为
CIKernel
),您可以(a)识别您正在寻找的确切颜色,并且(b)具有“感兴趣区域”或ROI。您是否正在寻找与您的链接具有类似输出的链接?(黑色,除非它是颜色且在ROI范围内?)是的,谢谢您的描述性回答!有没有什么办法也可以用HSV来实现这一点,或者只使用RGB?也许是一个起点:在我的回答中:我链接了一些HSL例程(不是我写的)。