当前位置:   article > 正文

python 读取图像(cv2,PIL,subplot)_python cv2读取图片

python cv2读取图片
  1. function:用cv2 读取、显示、保存 图像
  2. c2.read->按照bgr读取->show->可以正常显示bgr->write->把bgr转成rgb才会写入
  3. plot 显示的是rgb
  4. https://www.qianbo.com.cn/Tool/Rgba/ rgb对应颜色查询
import cv2
import matplotlib.pyplot as plt
import numpy as np
def show_img_cv2(rgb,window_name = 'bgr'):
    cv2.namedWindow(window_name, cv2.WINDOW_AUTOSIZE)#cv2.WINDOW_NORMAL:用户可以改变这个窗口大小  cv2.WINDOW_AUTOSIZE:窗口大小自动适应图片大小,并且不可手动更改
    cv2.imshow(window_name,rgb),cv2.waitKey()

def get_img_cv2(img_path):
    bgr = cv2.imread(img_path)#如果读取成功,返回(h,w,c)的bgr图片!!,即使你在目录下看到的是rgb,但它读取过来自动转化为bgr
    if bgr is None:
        print('cv2 get ', img_path.split('\\')[-1], ' failed! ',end='')
        raise Exception('maybe there are something wrong with path!')
        #return
    return bgr
def save_img_cv2(path,bgr):
    try:
        succ = cv2.imwrite(path, bgr)#只能保存 BGR 3通道图像
        if succ == False:
            print('check the path!',end=' ');
            raise NameError()
    except Exception:
        print('save img failed!')

def plt_img(img):
    plt.figure()
    plt.imshow(img)
    plt.show()#注意,plt需要的img格式为rgb
    #plt.savefig('plt_fig.png')



path = r'‪C:\Users\13361\Pictures\Camera Roll\mac.jpg'
bgr = get_img_cv2(path)#取出(h,w,3)的数组
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

1. 用cv2读取出来的数组是bgr格式的,使用cv2.imshow显示


show_img_cv2(bgr)
  • 1

在这里插入图片描述

2. pyplot是用rgb格式显示的,直接显示在cv2得到的图像会出错

plt_img(bgr)
  • 1

3. 把bgr格式转化为rgb


rgb = cv2.cvtColor(bgr,cv2.COLOR_BGR2RGB)
show_img_cv2(rgb,'rgb')
plt_img(rgb)
  • 1
  • 2
  • 3

在这里插入图述plot

4. cv2.imwrite(img), img必须是bgr格式,否则图片会出错

save_img_cv2(r'..\data\rgb.png',rgb)
save_img_cv2(r'..\data\bgr.png',bgr)
  • 1
  • 2

在这里插入图片描述

5. PIL包处理图像,Image.open(path)读取出来的是一个图像对象,而不是数组

def get_img_PIL(path):
    from PIL import Image
    try:
        img_obj = Image.open(path)#这是一个Image对象(RGB), 直接对图像进行操作,而不是数组
        #img_obj.show()
        #img = np.asarray(img_obj)#转化为数组
        #img_obj = Image.fromarray(np.uint8(img))#从数组转化为Image对象
        #img_obj.save('')#保存路径
        return img_obj
    except Exception:
        print('PIL op failed!')
img_obj = get_img_PIL(path)
img_obj.show()
img = np.asarray(img_obj)
img.shape
(2124, 2070, 3)
img_obj = Image.fromarray(np.uint8(img))#从数组转化为Image对象
<PIL.Image.Image image mode=RGB size=2070x2124 at 0x21A1521F7B8>
img_obj.save(path)#保存路径
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在这里插入图片描述

6. subplot

def subpolt(img_dict,row = 1,column = 3):
    plt.figure()
    for k,(name,img) in enumerate(img_dict.items()):
        subplot = plt.subplot(row, column, k+1)#第三个参数代表第几个图像,从1开始
        plt.imshow(img)  # 通过for循环逐个显示图像
        subplot.set_title(name)
        plt.xticks([])  # 去掉x轴的刻度
        plt.yticks([])  # 去掉y轴的刻度
    plt.show()

img_dict = {'bgr(read from cv2)':bgr,'rgb':rgb, 'Image from PIL':img_obj,}
subpolt(img_dict,row = 1,column = 3)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/822904
推荐阅读
相关标签
  

闽ICP备14008679号