使用张量流创建图像的颜色直方图

时间:2015-12-07 10:04:48

标签: tensorflow

有没有一种简洁的方法来计算图像的颜色直方图?也许通过滥用tf.histogram_summary的内部代码?从我所看到的,这段代码不是很模块化,直接调用一些C ++代码。

提前致谢。

3 个答案:

答案 0 :(得分:6)

我会使用tf.unsorted_segment_sum,其中"段ID"根据颜色值计算,你总和的是tf.ones向量。请注意,tf.unsorted_segment_sum可能更好地被认为是"桶总和"。它实现了dest[segment] += thing_to_sum - 完全是直方图所需的操作。

稍微伪代码(意思是我没有运行):

binned_values = tf.reshape(tf.floor(img_r * (NUM_BINS-1)), [-1])
binned_values = tf.cast(binned_values, tf.int32)
ones = tf.ones_like(binned_values, dtype=tf.int32)
counts = tf.unsorted_segment_sum(ones, binned_values, NUM_BINS)

如果你想巧妙地构建你的"那么你可以在一次通过中完成这个,而不是用分裂来分离r,g和b值。看起来像" 100100 ..."对于红色," 010010"对于绿色等,但我怀疑它总体上会更慢,而且难以阅读。我只是做你上面提到的拆分。

答案 1 :(得分:2)

这就是我现在正在使用的:

# Assumption: img is a tensor of the size [img_width, img_height, 3], normalized to the range [-1, 1].
with tf.variable_scope('color_hist_producer') as scope:
  bin_size = 0.2
  hist_entries = []
  # Split image into single channels
  img_r, img_g, img_b = tf.split(2, 3, img)
  for img_chan in [img_r, img_g, img_b]:
    for idx, i in enumerate(np.arange(-1, 1, bin_size)):
      gt = tf.greater(img_chan, i)
      leq = tf.less_equal(img_chan, i + bin_size)
      # Put together with logical_and, cast to float and sum up entries -> gives count for current bin.
      hist_entries.append(tf.reduce_sum(tf.cast(tf.logical_and(gt, leq), tf.float32)))

  # Pack scalars together to a tensor, then normalize histogram.
  hist = tf.nn.l2_normalize(tf.pack(hist_entries), 0)

答案 2 :(得分:2)

tf.histogram_fixed_width 

可能就是你要找的......

的完整文档

https://www.tensorflow.org/api_docs/python/tf/histogram_fixed_width