参考博客:
1.查看非三通道的图片–python
链接:https://blog.csdn.net/weixin_43711726/article/details/104346174?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242
2.python 单通道转3通道,tensorflow灰度图转RGB图
链接:https://blog.csdn.net/qq_18941713/article/details/93875122?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control

  • 一、查看图片是否为三通道
    因为彩色图片一般为三通道(RGB)图片,灰度图片为单通道图片,现在得到一张图片要检测其是否为单通道(我在跑代码的时候发现三通道的图片运行成功,而我想要测试的图片却发现无法成功运行,故怀疑图片通道的问题),附上检测代码:
from PIL import Image
import os
path = "./data"  # 存放图片的文件夹路径
filelist = os.listdir(path)
print(len(filelist))  # 显示文件夹内有多少张图片
for file in filelist:
    img = Image.open("./data/"+file)  # 文件夹下的图片
    try:
        r, g, b = img.split()
    except Exception:
        print(file)  # 显示不是三通道图片的图片名
  • 二、将单通道转换成三通道

参考本文上面链接的博文,发现效果还是可以的,就是有多余坐标等信息,并且没有保存处理完之后的图片。我使用了plt的savefig函数用来保存,虽然能保存,却显示的是空白图片且图片分辨率也有问题,因此采用cv2的imwrite函数来实现,可在不损失原图和不增加多余边框的情况下,达到想要图片的效果。附上代码:

from PIL import Image, ImageChops, ImageEnhance
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
import cv2

if __name__ == "__main__":
    img_data = Image.open('Cam1_055930_0.jpg', 'r')
    # img_data = cv2.imread('Cam1_055930_0.jpg')
    # 若图片是以PIL方式读取的,则此处显示的是元胞,若以cv2读取,则是width*heigh*3的数值(单张分辨率*3通道)
    print(img_data.size)  # (1100,180)

    # plt.subplot(1, 2, 1)
    # plt.title("origin")
    # plt.imshow(img_data)

    img = np.array(img_data)
    img = img.reshape(180, 1110, 1)
    img_tensor = tf.convert_to_tensor(img)
    img_tensor = tf.image.grayscale_to_rgb(img_tensor)

    sess = tf.Session()
    img = sess.run(img_tensor)
    print(img_tensor.shape)  # (180,1110,3)

    # plt.subplot(1, 2, 2)
    # plt.subplot()
    # plt.title("rgb")
    # # plt.savefig('./Cam1.jpg', dpi=100)
    # plt.imshow(img)
    # plt.show()

    cv2.imwrite('./Cam_0.jpg', img)  # 保存在当前目录,并取名为Cam_0,格式为jpg

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐