2015-12-07 3 views
5

Есть ли опрятный способ вычисления цветовой гистограммы изображения? Может быть, злоупотребляя внутренним кодом tf.histogram_summary? Из того, что я видел, этот код не очень модульный и вызывает непосредственно некоторый код на C++.Создать гистограмму цвета изображения с помощью тензорного потока

Заранее спасибо.

+0

Вы хотите использовать гистограмму в вычислении позже TF, или выводит гистограмму на конечная цель? – dga

+0

@dga Я использую его в последующем вычислении TF. – panmari

ответ

5

Я хотел бы использовать tf.unsorted_segment_sum, где «идентификаторы сегментов» вычисляется из значений цвета и то, что вам сумма является 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) 

Вы могли бы сделать это за один проход вместо выделяющий г, г, б значения с раздельным, если вы хотите искусно создайте свои «те», чтобы выглядеть «100100 ...» для красного, «010010» для зеленого и т. д., но я подозреваю, что это будет медленнее в целом и труднее читать. Я бы просто сделал раскол, который вы предложили выше.

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) 
Смежные вопросы