ios - 如何从 CIAreaHistogram 中提取主色?

标签 ios image-processing uiimage core-image ciimage

我想分析 iOS 上 UIImage 中最主要的颜色(颜色出现在大多数像素中),我偶然发现了 Core Image 基于过滤器的 API,尤其是 CIAreaHistogram。

看起来这个过滤器可能对我有帮助,但我很难理解 API。首先,它表示过滤器的输出是一个一维图像,它是输入箱的长度和一个像素的高度。我如何读取这些数据?我基本上想找出频率最高的颜色值,所以我希望数据包含每种颜色的某种频率计数,我不清楚这个一维图像将如何表示,因为它实际上并不解释我在这个一维图像中可以预期的数据。如果它真的是直方图,为什么它不返回表示像字典一样的数据结构

其次,在 API 中它要求提供多个 bin?输入应该是什么?如果我想要一个精确的分析,输入 bin 参数会是我图像的色彩空间吗?使 bin 值变小有什么作用,我想它只是通过欧几里得距离到最近的 bin 来近似附近的颜色。如果是这种情况,将不会产生精确的直方图结果,为什么有人要这样做?

从 API 的角度对上述两个问题的任何输入都会对我有很大帮助

最佳答案

Ian Ollmann 仅针对色调计算直方图的想法非常简洁,可以使用简单的颜色核来完成。该内核返回仅包含图像色调的单色图像(基于 this original work )

let shaderString = "kernel vec4 kernelFunc(__sample c)" +
"{" +
"    vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);" +
"    vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));" +
"    vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));" +

"    float d = q.x - min(q.w, q.y);" +
"    float e = 1.0e-10;" +
"    vec3 hsv = vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);" +
"    return vec4(vec3(hsv.r), 1.0);" +
"}"

let colorKernel = CIColorKernel(string: shaderString)

如果我得到蓝天图像的色调,则生成的直方图如下所示:

blue sky histogram

...而温暖的日落会给出这样的直方图:

enter image description here

因此,这看起来是获得图像主色调的好方法。

西蒙

关于ios - 如何从 CIAreaHistogram 中提取主色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37470847/

相关文章:

ios - cv::Mat 与 UIImageView 宽度不匹配?

php - fengyuanchen jQuery 裁剪插件 - 最小裁剪验证

ios - 在 `UIImage`中加载 `UItableViewCell`无法正常工作

opencv - 矩形空白区域检测 (OpenCV)

ios - 中心和宽高比适合图像

iphone - UIWebView 使用回调加载图像

ios - 模态视图状态栏

c# - 使用 C# API 进行 iOS 开发

ios - 从父类(super class)调用由子类实现的协议(protocol)方法

image-processing - 轮廓寻找