• OpenCV+python 彩色图像通道拆分与组合并判断size,shape函数的用法与区别


    1、关于python中size与shape的用法,我一直是一头雾水,今天总结下,size既可以用作属性亦可以当做函数来使用,如a.size,np.szie(a),它是用来判断数组中所有元素的个数

    ,而shap与size类似,既可以用作属性亦可以当做函数来使用,如b.shape,np.shape(b),他是用来判断数组的维度

    2、关于图像的加载与显示,plt.imshow与cv2.imshow显示的时候会有色差的问题,因为OpenCV显示的BGR,而plt.imshow显示的是RGB

    3、通道的分离与融合分别是OpenCV中的split与merge函数

    4、通过scipy.misc方法将图片转换成数组格式

     1 #!/usr/bin/env python 3.6
     2 #_*_coding:utf-8 _*_
     3 #@Time    :2019/12/25 21:42
     4 #@Author  :控制工程小小白
     5 #@FileName: RGB_split_merge.py
     6 
     7 #@Software: PyCharm
     8 from PIL import Image
     9 import cv2
    10 from scipy import misc
    11 from matplotlib import pyplot as plt
    12 import numpy as np
    13 image_PIL=Image.open("our happy time.jpg")#打开图片
    14 """判断图像类型并使用size,shape 用法"""
    15 """---------------------------------------------------------------------"""
    16 print(type(image_PIL))#此时的image不是数组格式,而是图片格式
    17 image_numpy=misc.imread("our happy time.jpg")#通过scipy.misc方法将图片转换成数组格式
    18 print(image_numpy)
    19 print(type(image_numpy))#此时的输出是数组格式
    20 print(np.size(image_numpy))#size既可以用作对象的属性a.size,也可以用作方法np.size(a),输出数组的元素的所有个数
    21 print(image_numpy.size)
    22 print(np.shape(image_numpy))#与size一样,既可以用作对象的属性a.shape,也可以用作方法np.shape(a),输出数组的维度
    23 print(image_numpy.shape)
    24 """---------------------------------------------------------------------------------------"""
    25 """对于采用Image方法类读取并且显示图片时,下面4行一般配套使用"""
    26 plt.figure('jiaqi')#打开显示的窗口并给显示的窗口命名
    27 plt.imshow(image_PIL)#imshow方法显示要显示的图片,如果没有plt.show()的配套使用,将不会显示图橡
    28 plt.axis('on')#显示坐标轴
    29 plt.show()#与plt.imshow配套使用
    30 """---------------------------------------------------------------------------"""
    31 """opencv 加载与显示与保存图像"""
    32 image_opencv=cv2.imread("our happy time.jpg")#是用OpenCV方法打开图像
    33 cv2.namedWindow('our happy time.jpg',cv2.WINDOW_NORMAL)#创建一个显示窗口并命名
    34 cv2.imshow('our happy time.jpg',image_opencv)#在这里需要注意OpenCV显示的图像与matplotlib显示的图像会有色差问题
    35                                               #因为plt.show()接口是RGB,而OpenCV是BGR
    36 plt.imshow(image_opencv)#注意这个是用OpenCV读取图像,但是是用matplotlib显示图像,个人觉得这个比cv2.imshow()显示效果要好
    37 plt.show()
    38 cv2.namedWindow('OpenCV_image',cv2.WINDOW_NORMAL)#创建一个显示窗口并命名
    39 cv2.imshow('OpenCV_image',image_opencv)
    40 cv2.waitKey(0)
    41 k=cv2.waitKey(0)#等待键入指令
    42 if k==27:#wait for ESC key to exit
    43     cv2.destroyAllWindows()#销毁窗口
    44 elif k==ord('s'):#键入s就保存窗口
    45     cv2.imwrite('our happy time.jpg',image_opencv)
    46     cv2.destroyAllWindows()
    47 """探索OpenCV与plt.show()显示图像的区别"""
    48 b,g,r=cv2.split(image_opencv)#将图像的三个通道分开,分别是B,G,R
    49 image_merge=cv2.merge([r,g,b])#将三个通道按照R,G,B顺序进行融合
    50 plt.figure('image')
    51 plt.subplot(231);plt.imshow(image_opencv)#显示使用OpenCV打开的图像BGR
    52 plt.subplot(232);plt.imshow(image_PIL)#显示使用PIL打开的图像
    53 plt.subplot(233);plt.imshow(b)#分别显示三个通道的图像
    54 plt.subplot(234);plt.imshow(g)
    55 plt.subplot(235);plt.imshow(r)
    56 plt.subplot(236);plt.imshow(image_merge)#显示融合之后的RGB图像
    57 plt.show()

    输出结果:

    <class 'PIL.PngImagePlugin.PngImageFile'>
    [[[226 137 125]
    [226 137 125]
    [223 137 133]
    ...
    [230 148 122]
    [221 130 110]
    [200 99 90]]

    [[226 137 125]
    [226 137 125]
    [223 137 133]
    ...
    [230 148 122]
    [221 130 110]
    [200 99 90]]

    [[226 137 125]
    [226 137 125]
    [223 137 133]
    ...
    [230 148 122]
    [221 130 110]
    [200 99 90]]

    ...

    [[ 84 18 60]
    [ 84 18 60]
    [ 92 27 58]
    ...
    [173 73 84]
    [172 68 76]
    [177 62 79]]

    [[ 82 22 57]
    [ 82 22 57]
    [ 96 32 62]
    ...
    [179 70 79]
    [181 71 81]
    [185 74 81]]

    [[ 82 22 57]
    [ 82 22 57]
    [ 96 32 62]
    ...
    [179 70 79]
    [181 71 81]
    [185 74 81]]]
    <class 'numpy.ndarray'>
    786432
    786432
    (512, 512, 3)
    (512, 512, 3)

  • 相关阅读:
    maven笔记
    enum笔记
    mysql笔记
    git笔记
    spark笔记
    使用GitHub进行团队合作
    深度学习网站
    顶级论文索引网站
    研究生-数学建模集
    算法练习网站
  • 原文地址:https://www.cnblogs.com/hujinzhou/p/jiazhou2019_12_26.html
Copyright © 2020-2023  润新知