用TensorFlow颜色映射图像?

时间:2018-04-10 19:34:34

标签: tensorflow

我在TFRecord文件中保存灰度图像。然后我的想法是在我的GPU上对它们进行颜色映射(当然只使用TF),这样它们就可以获得三个通道(它们将用于预先训练好的VGG-16型号,因此它们必须有三个通道)。

有没有人知道如何正确吗?

我尝试使用自制的TF颜色映射脚本,使用for循环,tf.scatter_nd和一个shape = (256,3)的映射数组...但它花了很长时间。

修改

img_rgb = GRAY SCALE IMAGE WITH 3 CHANNELS

cmp =  [[255,255,255],
        [255,255,253],
        [255,254,250],
        [255,254,248],
        [255,254,245],

        ...

        [4,0,0],
        [0,0,0]]


cmp = tf.convert_to_tensor(cmp, tf.int32) # (256, 3)
hot = tf.zeros([224,224,3], tf.int32)



for i in range(img_rgb.shape[2]):
for j in range(img_rgb.shape[1]):
    for k in range(img_rgb.shape[0]):
        indices = tf.constant([[k,j,i]])
        updates = tf.Variable([cmp[img_rgb[k,j,i],i]])
        shape = tf.constant([256, 3])
        hot = tf.scatter_nd(indices, updates, shape)

这是我的尝试,我知道它不是最佳选择,但这是我能想到的唯一解决方案。

2 个答案:

答案 0 :(得分:1)

我们来帮忙。如果每个人都编写了最佳代码,就不需要Stackoverflow。 :)

以下是我将如何取代最后7行(未经测试的代码):

conv_img = tf.gather( params = cmp,
                      indices = img_rgb[ :, :, 0 ] )

基本上,不需要for循环,Tensorflow将为您做到这一点,并且更快。 tf.gather()将根据提供的索引从cmp收集元素,这里将是img_rgb的第0个频道。每个收集的元素将包含来自cmp的三个通道,因此当您将它们放在一起时,它将形成一个图像。

我现在没时间测试,跑步,抱歉。希望它有效。

答案 1 :(得分:0)

感谢{@ {3}}

import matplotlib
import matplotlib.cm

import tensorflow as tf

def colorize(value, vmin=None, vmax=None, cmap=None):
        """
        A utility function for TensorFlow that maps a grayscale image to a matplotlib
        colormap for use with TensorBoard image summaries.
        Arguments:
          - value: 2D Tensor of shape [height, width] or 3D Tensor of shape
            [height, width, 1].
          - vmin: the minimum value of the range used for normalization.
            (Default: value minimum)
          - vmax: the maximum value of the range used for normalization.
            (Default: value maximum)
          - cmap: a valid cmap named for use with matplotlib's `get_cmap`.
            (Default: 'gray')
        Example usage:
        ```
        output = tf.random_uniform(shape=[256, 256, 1])
        output_color = colorize(output, vmin=0.0, vmax=1.0, cmap='plasma')
        tf.summary.image('output', output_color)
        ```

        Returns a 3D tensor of shape [height, width, 3].
        """

        # normalize
        vmin = tf.reduce_min(value) if vmin is None else vmin
        vmax = tf.reduce_max(value) if vmax is None else vmax
        value = (value - vmin) / (vmax - vmin) # vmin..vmax

        # squeeze last dim if it exists
        value = tf.squeeze(value)

        # quantize
        indices = tf.to_int32(tf.round(value * 255))

        # gather
        cm = matplotlib.cm.get_cmap(cmap if cmap is not None else 'gray')
        colors = tf.constant(cm.colors, dtype=tf.float32)
        value = tf.gather(colors, indices)

        return value

您也可以尝试tf.image.grayscale_to_rgb,尽管似乎只有一种颜色映射选择,gray