用tensorflow将图片灰度化,很简单的一个问题,几句代码就OK了。但是这里边有很多坑,稍不留神,半天都不一定找得到原因。我下面说说我遇到的坑,希望看到这篇博客的你,别遇到。
先给代码,再介绍我遇到的坑:
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt from keras_preprocessing.image import load_img,img_to_array %matplotlib inline image_name = 'cat1.jpg' image = load_img(image_name) #将图片转换为数组 image = img_to_array(image) #转为黑白 image = tf.image.rgb_to_grayscale(image) image = tf.squeeze(image,2) plt.imshow(image)
步骤很简单:
读取彩色图片 转换为黑白图片 显示这个黑白图片就这简简单单的几步,我却遇到了很多问题,不过在解决问题的过程中又学到了很多,还是很有收获的。
坑一:#坑一、不将image转换为数组,直接用rgb_to_grayscale方法,将图片转为灰度图片 image_name = 'cat1.jpg' image = load_img(image_name) #转为黑白 image = tf.image.rgb_to_grayscale(image)
执行上边代码会报错如下图,不能直接将一个图片转化为一个tensor。这里需要先将image对象转化为数组array。然后通过百度学会了img_to_array()方法。
坑二:#坑二:最后图片无法显示 image_name = 'cat1.jpg' image = load_img(image_name) #将图片转换为数组 image = img_to_array(image) #转为黑白 image = tf.image.rgb_to_grayscale(image) plt.imshow(image)
错误信息:
原图是三维的,图片维度为(480,500,3),转为黑白后图片的shape变成了(480,500,1)。猜测,黑白的是不是就两维。于是进行了降维操作 学习了tf.squeeze()方法,具体请看https://ximing.blog.csdn.net/article/details/103261290
最后降维后,大功告成,结束!
补充:我当时看了image的类型,本以为是因为转换为array后,里边值的类型为float,所以才不会显示图片。当时就把float类型转为了int型。后来才发现,其实不管array里的值类型是float还是int,都会显示。所以第一版成功运行的代码是把图片类型也转换了,代码如下,第六行多了一句将图片转为int型的代码。
image_name = 'cat1.jpg' image = load_img(image_name) plt.imshow(image) #将图片转换为数组 image = img_to_array(image) image = image.astype(dtype='uint8') #转为黑白 image = tf.image.rgb_to_grayscale(image) #降维 image = tf.squeeze(image,2) plt.imshow(image)
作者:hello689