Ios 按颜色过滤图像中的像素
我的项目是使用视觉识别视野中的某个矩形。我知道这个长方形会有某种颜色。在OpenCV中,有一个过滤器,允许您按颜色过滤像素,如图所示 我是CoreImage框架的新手,但我看不到任何可以实现此目标的过滤器。是否有某种内置过滤器(不一定要在CoreImage中),或者我需要学习如何编写自己的过滤器?目标 我从给定链接下的信息中了解到,您希望将红色区域过滤为白色,将所有其他区域过滤为黑色 为此,可以使用CIColorKernel CIColorKernel 一种基于GPU的图像处理例行程序,仅处理图像中的颜色信息,用于创建自定义核心图像过滤器 看 屏幕截图 这里是一个背景颜色难看的屏幕截图,可以更好地看到图像覆盖的区域 上部区域显示输入图像。在下方区域中,将显示生成的图像 来源Ios 按颜色过滤图像中的像素,ios,swift,core-image,apple-vision,Ios,Swift,Core Image,Apple Vision,我的项目是使用视觉识别视野中的某个矩形。我知道这个长方形会有某种颜色。在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例程(不是我写的)。