2015-12-07 16 views
5

Czy istnieje sposób na obliczenie histogramu koloru obrazu? Może przez nadużycie wewnętrznego kodu tf.histogram_summary? Z tego, co widziałem, ten kod nie jest bardzo modułowy i wywołuje bezpośrednio trochę kodu C++.Tworzenie histogramu kolorów obrazu przy użyciu tensorflow

Z góry dziękuję.

+0

Chcesz użyć histogramu w późniejszych obliczeń TF, czy jest wyprowadzanie histogram się cel końcowy? – dga

+0

@dga Używam go w późniejszych obliczeniach TF. – panmari

Odpowiedz

5

użyłbym tf.unsorted_segment_sum, gdzie „Identyfikatory segment” są obliczane na podstawie wartości kolorów, a rzeczą, którą suma jest tf.ones wektorowych. Zauważ, że tf.unsorted_segment_sum jest prawdopodobnie lepiej pomyślany jako "suma kubełkowa". Implementuje ona dest[segment] += thing_to_sum - dokładnie taką operację, jakiej potrzebujesz do histogramu.

w nieco Pseudokod (co oznacza, że ​​nie uruchomić tego):

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) 

Można tego dokonać w jednym przejściu zamiast oddzielenie R, G i B o wartości ułamku jeśli chciał sprytnie skonstruuj swoje "te", aby wyglądały jak "100100 ..." dla czerwieni, "010010" dla zieleni itp., ale podejrzewam, że ogólnie byłoby wolniejsze i trudniejsze do odczytania. Po prostu zrobię podział, który zaproponowałeś powyżej.

2

To co używam teraz:

# 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) 
Powiązane problemy