最近在做图像处理,发现了一个很有意思的事情,特此记录:
已知"F:\Basketball\0001.jpg"是彩色图像,"F:\Car1\0001.jpg"是灰度图像,但是使用cv2.imread()读进来的shape都是三通道。。。
两幅图片的原图分别如图所示:
filename = tf.placeholder(tf.string, [], name='filename')
image_file = tf.read_file(filename)
# Decode the image as a JPEG file, this will turn it into a Tensor
image = tf.image.decode_jpeg(image_file) # 图像解码成矩阵
image = 255.0 * tf.image.convert_image_dtype(image, tf.float32)
with tf.Session() as sess:
img_name1 = "F:\\Basketball\\0001.jpg"
img_name2 = "F:\\Car1\\0001.jpg"
image1_ = sess.run(image,feed_dict={filename:img_name1})
image2_ = sess.run(image, feed_dict={filename: img_name2})
print(image1_.shape) #(240,320,3)
print(image2_.shape) #(240,320,1)
a = cv2.imread("F:\\Basketball\\0001.jpg")
b = cv2.imread("F:\\Car1\\0001.jpg")
print(a.shape) #(240,320,3)
print(b.shape) #(240,320,3)
想要都变成三通道的方法:在tf.image.decode_jpeg函数中加入参数 channels=3
image = tf.image.decode_jpeg(image_file,channels=3)
2018.10.09更新:
今天看mask rcnn源码时,发现了一种操作,判断读入的是灰度图还是RGB图,如果是灰度图,则将其转换成RGB,使用了tf.size()函数来获取image的尺寸,使用tf.cond()函数来进行条件判断,特此记录。
灰度图的尺寸是(h,w,1)
彩色图的尺寸是(h,w,3)
imsize = tf.size(image) #获取image的尺寸
image = tf.cond(tf.equal(imsize, ih * iw), #tf.cond()条件表达式,满足条件执行第一个表达式,否则执行第二个lambda表达式
lambda: tf.image.grayscale_to_rgb(tf.reshape(image, (ih, iw, 1))), #灰度变成RGB
lambda: tf.reshape(image, (ih, iw, 3)))
```