【发布时间】:2018-08-26 13:46:36
【问题描述】:
1.简介:
所以我想为uiimages开发一种特殊的过滤方法——我的想法是把一张图片的所有颜色都变成黑色,除了某种颜色,应该保持它们的外观。
图片总是很漂亮,所以看看这张图片来了解我想要实现的目标:
2.说明:
我想应用能够在图像中找到特定颜色的过滤器(算法)。该算法必须能够将所有与参考颜色不匹配的颜色替换为例如“黑色”。
我开发了一个简单的代码,它能够替换任何图像中的特定颜色(带阈值的颜色范围)。 但是这个解决方案似乎根本不是一种快速有效的方法!
func colorFilter(image: UIImage, findcolor: String, threshold: Int) -> UIImage {
let img: CGImage = image.cgImage!
let context = CGContext(data: nil, width: img.width, height: img.height, bitsPerComponent: 8, bytesPerRow: 4 * img.width, space: CGColorSpaceCreateDeviceRGB(), bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)!
context.draw(img, in: CGRect(x: 0, y: 0, width: img.width, height: img.height))
let binaryData = context.data!.assumingMemoryBound(to: UInt8.self),
referenceColor = HEXtoHSL(findcolor) // [h, s, l] integer array
for i in 0..<img.height {
for j in 0..<img.width {
let pixel = 4 * (i * img.width + j)
let pixelColor = RGBtoHSL([Int(binaryData[pixel]), Int(binaryData[pixel+1]), Int(binaryData[pixel+2])]) // [h, s, l] integer array
let distance = calculateHSLDistance(pixelColor, referenceColor) // value between 0 and 100
if (distance > threshold) {
let setValue: UInt8 = 255
binaryData[pixel] = setValue; binaryData[pixel+1] = setValue; binaryData[pixel+2] = setValue; binaryData[pixel+3] = 255
}
}
}
let outputImg = context.makeImage()!
return UIImage(cgImage: outputImg, scale: image.scale, orientation: image.imageOrientation)
}
3.代码信息 上面的代码运行良好,但绝对无效。由于所有的计算(尤其是颜色转换等),这段代码需要很长时间(太长),所以看看这个截图:
-
我的问题我很确定有一种更简单的过滤特定颜色(具有给定阈值
#c6456f is similar to #C6476f, ...)的解决方案,而不是循环遍历每个像素来比较它的颜色。- 所以我想的是过滤器(CIFilter 方法)之类的东西,作为顶部代码的替代方法。
-
一些注意事项
因此,我不要求您发布任何包含使用 openCV 库的建议的回复。我想专门用 Swift 开发这个“算法”。
随着时间的推移,截取屏幕截图的图像大小的分辨率为 500 * 800 像素
仅此而已
你真的读到这里了吗? - 恭喜 - 任何帮助如何加速我的代码将非常感谢! (也许有更好的方法来获取像素颜色而不是循环遍历每个像素)提前一百万 :)
【问题讨论】:
-
与其将每个像素都转换为 HSL,不如直接将目标颜色设为 RGB。另外,你能发帖
calculateHSLDistance吗? -
因为 RGB 光谱与我们人类的颜色范围大不相同,而 HSL 几乎相同! @mnistic
-
很可能是您的 RGB 到 HSV 转换和距离计算很慢。 (我猜
RGBtoHSL是您在另一个问题中显示的功能。)如果您必须在 HSV 中进行比较,您可以先在 RGB 中进行粗略检查,并且仅在颜色接近时才详细调查 HSV 距离。如果只匹配精确的 RGB 颜色,性能如何? -
HSL 根本不是“与我们人类的颜色范围几乎相同”(无论这意味着什么)。我们的眼睛测量入射光波长的方式与 RGB 相机大致相同。早期视觉将其转换为三色值(CIE Yxy 试图近似此值,CIE 实验室做得更好)。 HSL 是一种尴尬的色彩空间,旨在让用户更容易在 UI 中输入颜色。它不适合颜色分析。在 RGB 中比较您的颜色,您将获得更好的结果,而且速度更快。
-
@Spektre:感谢这些链接,有趣的阅读!
标签: ios swift image algorithm image-processing