远处的颜色检测(Swift)

有人能指出我在正确的方向与远处的颜色检测? 我已经使用了下面的代码,如果一个对象或兴趣点距离不到10英尺,它会正确地抓取图像的RBG值。 当对象在远处时,代码返回错误的值。 我想拍摄距离大于10英尺的物体的照片,并检测该图像的颜色。

//On the top of your swift extension UIImage { func getPixelColor(pos: CGPoint) -> UIColor { let pixelData = CGDataProviderCopyData(CGImageGetDataProvider(self.CGImage)) let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData) let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4 let r = CGFloat(data[pixelInfo]) / CGFloat(255.0) let g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0) let b = CGFloat(data[pixelInfo+2]) / CGFloat(255.0) let a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0) return UIColor(red: r, green: g, blue: b, alpha: a) } } 

我是一名摄影师,你所要做的与在后期处理中使用白平衡或在PS中使用颜色select器非常相似。

数码相机没有一次捕捉全光谱的像素。 他们有三倍的RGB像素。 捕获的信息被插入,这可能会导致非常糟糕的结果。 在晚上拍摄的照片上设置白平衡几乎是不可能的。

不好的插值的原因:

  • 像素大于场景中最小的可辨识对象。 (莫尔文物)
  • 数字增益增加色差的光线不足的情况。 (彩色噪点伪影)
  • 图像转换为低质量的JPG,但有很多的边缘。 (jpg文物)

如果这是一个低质量的JPG,获得更好的来源IMG。

固定

所有你需要做的,以获得更准确的阅读,是模糊的形象。 最小的可接受的模糊是3个像素,因为这将撤销一些插值。 更大的模糊可能会更好。

由于模糊是昂贵的,所以最好将图像裁剪成模糊半径的倍数。 你不能采取一个精确的拟合,因为它也会模糊边缘和图像是黑色的边缘。 这会影响你的阅读。

如果您也对模糊半径执行上限,可能是最好的。


快捷方式获取大小的东西的中心。

 extension CGSize { var center : CGPoint { get { return CGPoint(x: width / 2, y: height / 2) } } } 

UIImage东西

 extension UIImage { func blur(radius: CGFloat) -> UIImage? { // extensions of UImage don't know what a CIImage is... typealias CIImage = CoreImage.CIImage // blur of your choice guard let blurFilter = CIFilter(name: "CIBoxBlur") else { return nil } blurFilter.setValue(CIImage(image: self), forKey: kCIInputImageKey) blurFilter.setValue(radius, forKey: kCIInputRadiusKey) let ciContext = CIContext(options: nil) guard let result = blurFilter.valueForKey(kCIOutputImageKey) as? CIImage else { return nil } let blurRect = CGRect(x: -radius, y: -radius, width: self.size.width + (radius * 2), height: self.size.height + (radius * 2)) let cgImage = ciContext.createCGImage(result, fromRect: blurRect) return UIImage(CGImage: cgImage) } func crop(cropRect : CGRect) -> UIImage? { guard let imgRef = CGImageCreateWithImageInRect(self.CGImage, cropRect) else { return nil } return UIImage(CGImage: imgRef) } func getPixelColor(atPoint point: CGPoint, radius:CGFloat) -> UIColor? { var pos = point var image = self // if the radius is too small -> skip if radius > 1 { let cropRect = CGRect(x: point.x - (radius * 4), y: point.y - (radius * 4), width: radius * 8, height: radius * 8) guard let cropImg = self.crop(cropRect) else { return nil } guard let blurImg = cropImg.blur(radius) else { return nil } pos = blurImg.size.center image = blurImg } let pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage)) let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData) let pixelInfo: Int = ((Int(image.size.width) * Int(pos.y)) + Int(pos.x)) * 4 let r = CGFloat(data[pixelInfo]) / CGFloat(255.0) let g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0) let b = CGFloat(data[pixelInfo+2]) / CGFloat(255.0) let a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0) return UIColor(red: r, green: g, blue: b, alpha: a) } } 

边注 :

你的问题可能不是色彩捕捉function,但你如何设置的重点。 如果您是通过触摸方式进行操作的,而且屏幕上的物体越来越小,则可能无法准确设置。