gpt4 book ai didi

ios - 如何计算 UIImage 的平均颜色?

转载 作者:IT王子 更新时间:2023-10-29 05:25:47 25 4
gpt4 key购买 nike

我想构建一个让用户选择图像并输出“平均颜色”的应用。

例如这张图片:

enter image description here

平均颜色为绿色/黄色。

此刻,我得到了这段代码:

// In a UIColor extension
public static func fromImage(image: UIImage) -> UIColor {
var totalR: CGFloat = 0
var totalG: CGFloat = 0
var totalB: CGFloat = 0

var count: CGFloat = 0

for x in 0..<Int(image.size.width) {
for y in 0..<Int(image.size.height) {
count += 1
var rF: CGFloat = 0,
gF: CGFloat = 0,
bF: CGFloat = 0,
aF: CGFloat = 0
image.getPixelColor(CGPoint(x: x, y: y)).getRed(&rF, green: &gF, blue: &bF, alpha: &aF)
totalR += rF
totalG += gF
totalB += bF
}
}

let averageR = totalR / count
let averageG = totalG / count
let averageB = totalB / count

return UIColor(red: averageR, green: averageG, blue: averageB, alpha: 1.0)
}

其中 getPixelColor 定义为:

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)
}
}

如您所见,我在这里所做的非常幼稚:我遍历图像中的所有像素,将它们的 RGB 相加,然后除以计数。

当我运行应用程序并选择图像时,应用程序卡住。我知道这是因为图像太大,两个嵌套的for循环执行了太多次。

我想找到一种有效获取图像平均颜色的方法。我该怎么做?

最佳答案

这不是一个真正的“答案”,但我觉得我可以提供一些关于颜色检测的提示,不管它值多少钱,所以我们开始吧。

调整大小

在您的情况下,提高速度的最大技巧是将图像的大小调整为合理尺寸的正方形。

没有神奇的值(value),因为它取决于图像是否嘈杂等,但是小于 300x300 以针对您的采样方法似乎是可以接受的,例如(但不要太极端)。

使用快速调整大小的方法 - 无需保持比例、抗锯齿或任何东西(SO 上有许多可用的实现)。我们正在计算颜色,我们对图像显示的方面不感兴趣。

我们从调整大小中获得的速度增益非常值得在调整大小时损失的几个周期。

步进

第二个技巧是步进采样。

对于大多数照片,您可以负担得起每隔一个像素或每隔一条线进行采样,并保持相同的颜色检测精度。

您也不能在几个像素宽上对大多数照片的边框进行采样(或一旦采样就丢弃)- 因为边框、框架、晕影等。它有助于进行平均(您想丢弃所有太边缘的东西并可能导致不必要的结果偏差)。

滤除噪音

要在采样中真正精确,您必须丢弃噪声:如果保留所有灰色,则所有检测都会太灰。例如,通过不保留饱和度非常低的颜色来滤除灰色。

计算颜色出现的次数

然后你就可以数你的颜色了,你应该在独特的颜色上工作。使用例如 NSCountedSet 来存储您的颜色及其出现次数,然后您可以处理每种颜色的出现次数并了解最常见的颜色等。

最后提示:在计算平均值之前过滤掉孤独的颜色 - 您决定阈值(例如“如果它在 300x300 图像中出现少于 N 次,则不值得使用”)。对准确性有很大帮助。

关于ios - 如何计算 UIImage 的平均颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36805349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com