创建色相直方图需要什么值?

范德纳斯

我有大量的图像。我想为所有这些对象创建一个色相直方图,例如这篇文章:http : //blog.scottlogic.com/2014/04/12/app-colour-analysis.html

最好的方法是什么,我需要从一组图像中获得什么值?

土豆皮

从博客文章中。

  1. 获取所有图片
  2. 对于每个图像,获取其中每个像素的色相值(因此,一个100px x 200px的图像将为您提供20000个这样的色相数据点)
  3. 获取每个色相值的像素计数(将有360个不同的色相值)
  4. 合并所有图像的计数,最终会得到类似这样的结果

  |  Hue  |  Count of pixels with this hue value across all images |
  ------------------------------------------------------------------
  |   0   |  xxxxxx                                                |
  |   1   |  yyyyyy                                                |
  ....
  |  360  |  zzzzzz                                                |

画一个圆,给每个径向线一个长度=第二列的缩放值(使用d3.scale)和对应于色相的颜色(可以使用d3.hsl

从数据的角度来看,您将必须弄清楚如何从图像中获取H值。一个很好的起点是如何从普通图像生成HSL或HSI直方图?


这是生成圆的一种方法(一旦有了数据)

// sample data - the index indicates the Hue value (0 - 360) and the value is the number of pixels
var data = []
for (var i = 0; i <= 360; i++)
    data.push(parseInt(Math.random() * 5000));


// size of the canvas
var size = 500;
// how much big do you want the inner circle to be 100% = no bars!
var innerCirclePercentage = 0.2;

var innerCircleRatio = 0.5 + innerCirclePercentage / 2;
var scale = d3.scale.linear().domain([0, d3.max(data)]).range([size * innerCircleRatio, size]);

var svgContainer = d3.select("body").append("svg")
  .attr("width", size)
  .attr("height", size);
var lines = svgContainer
  .selectAll(".line")
  .data(data);

lines.enter()
  .append("line")
  .attr("class", "line")
  .attr("x1", size * 0.5)
  .attr("y1", size * innerCircleRatio)
  .attr("x2", size * 0.5)
  .attr("y2", function(d, i) {
    return scale(d);
  })
  .attr("transform", function(d, i) {
    return "rotate(" + i + ", " + size * 0.5 + ", " + size * 0.5 + ")"
  })
  .style("stroke-width", 5)
  .style("stroke", function(d, i) {
    return "hsl(" + i + ", 80%, 50%)";
  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章