将灰度图像内容复制到3个通道

时间:2018-09-25 17:03:26

标签: python tensorflow keras deep-learning

我正在使用ImageDataGenerator批量加载灰度图像。我需要将每个灰度图像的内容复制到3个通道中。我尝试了以下代码,但似乎无法正常工作:

def grayscale_to_rgb(images, channel_axis=-1):
images= K.expand_dims(images, axis=channel_axis)
tiling = [1] * 4    # 4 dimensions: B, H, W, C
tiling[channel_axis] *= 3
images= K.tile(images, tiling)
return images




train_images_orign= grayscale_to_rgb(train_images_orign)
valid_images_orign= grayscale_to_rgb(valid_images_orign)
test_images_orign= grayscale_to_rgb(test_images_orign)

x_train, y_train = next(train_images_orign)
x_valid, y_valid = next(valid_images_orign)
x_test, y_test = next(test_images_orign)

我应该朝哪个方向完成?

3 个答案:

答案 0 :(得分:3)

更新:事实证明,已在Keras中实现了load_img功能in such a way,即如果要加载图像的颜色模式并使用给定的color_mode参数(默认为'RGB')不同,然后图像将转换为给定的color_mode。结果,在这种情况下,灰度图像将自动转换为RGB。


您也可以使用ImageDataGeneratorpreprocessing_function参数(假设您使用的是color_mode='grayscale',否则上面的说明适用):

import numpy as np

def gray_to_rgb(img):
    return np.repeat(img, 3, 2)

generator = ImageDataGenerator(..., preprocessing_function=gray_to_rgb)
train_gen = generator.flow_from_directory(color_mode='grayscale', ...)

请注意,在任何图像增强之后都将应用此功能:

  

preprocessing_function:函数将隐含在每个输入中。   该功能将在调整图像大小和扩大后运行。的   函数应该采用一个参数:一个图像(具有秩的块状张量   3),并应输出具有相同形状的Numpy张量。

答案 1 :(得分:0)

我没有使用ImageDataGenerator进行转换的直接方法,但是几天前我遇到了同样的问题,可以间接地使用opencv2将其转换为rgb,然后使用imageio将其读取为numpy。

import cv2
cv2.imread('path/to/img/a.png') # look at glob for reading from folder
cv2.cvtColor(gray,cv2.COLOR_GRAY2RGB)
cv2.imwrite('path/to/output/a.png')

import imageio
import skimage.transform as transform

image_size = 64
dimensions=4
array = []
for image_path in glob.glob("path/to/output/*.png"):
    try:
        im = imageio.imread(image_path)
        array = [*array, transform.resize(im, (image_size, image_size, dimensions))]
        array_names = [*array_names, image_path.split("output/")[1].split(".png")[0]]
    except ValueError:
        ""

np.array(array).shape

expand_dims可以与tensorflow 1.10.1辅助方法一起使用,这些方法与ImageDataGenerator紧密相关以直接执行相同操作,但是您必须以某种方式将其从gray2rgb进行转换,以改善此答案。

preprocess_input = tf.keras.applications.resnet50.preprocess_input
preds = model.predict(preprocess_input(np.expand_dims(array[0], axis=0))) # where model is some keras model

您将需要以下内容来解码输出

decode_predictions = tf.keras.applications.resnet50.decode_predictions
decode_predictions(preds, top=3)

如果这不能解决您的问题,或者至少提供解决方案的模板,请发表评论,我会相应地进行更新:)

答案 2 :(得分:0)

我认为我有一个更好的解决方案,那就是编写一个包装层

tbl:update longWgt:100f*longWgt, shortWgt:100f*shortWgt, netWgt:100f*netWgt from tbl;
tbl:update .Q.f[2] each longWgt, .Q.f[2] each shortWgt, .Q.f[2] each longWgtBeta, .Q.f[2] each shortWgtBeta, .Q.f[2] each longWgtRisk, .Q.f[2] each shortWgtRisk, .Q.f[2] each netWgt, .Q.f[2] each netExposure, .Q.f[2] each relativeBeta, .Q.f[2] each relativeRisk, .Q.f[2] each adjBeta, .Q.f[2] each adjRisk from tbl;
tbl:update {x,"%"} each longWgt, {x,"%"} each shortWgt, {x,"%"} each netWgt from tbl;

通过这种方式,class MyPreprocess( Layer ) : def call( self, inputs ) : # expand your input from gray scale to rgb # if your inputs.shape = (None,None,1) fake_rgb = K.concatenate( [inputs for i in range(3)], axis=-1 ) fake_rgb = K.cast( fake_rgb, 'float32' ) # else use K.stack( [inputs for i in range(3)], axis=-1 ) # preprocess for uint8 image x = preprocess_input( fake_rgb ) return x def compute_output_shape( self, input_shape ) : return input_shape[:3] + (3,) gray_in = Input(shape=(None,None,1), name='gray_uint8') tensor_in = MyPreprocess(name='preproc')( gray_in ) pred_out = PretrainedModel( tensor_in ) new_model = Model( inputs=gray_in, outputs=pred_out ) 可以直接用于预测new_model图像。