有沒有簡單的方法來計算圖像的顏色直方圖?也許通過濫用內部代碼tf.histogram_summary
?從我所看到的,這個代碼不是很模塊化,直接調用一些C++代碼。使用張量流創建圖像的顏色直方圖
在此先感謝。
有沒有簡單的方法來計算圖像的顏色直方圖?也許通過濫用內部代碼tf.histogram_summary
?從我所看到的,這個代碼不是很模塊化,直接調用一些C++代碼。使用張量流創建圖像的顏色直方圖
在此先感謝。
我會用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」等,但我懷疑它會整體變慢,而且難以閱讀。我只是做你上面提出的拆分。
這是我現在使用什麼:
# 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)
tf.histogram_fixed_width
可能是你在找什麼...
完整文檔上
https://www.tensorflow.org/api_docs/python/tf/histogram_fixed_width
你想使用在以後的TF計算直方圖,或輸出的直方圖最終目標? – dga
@dga我在後面的TF計算中使用它。 – panmari