当前位置:   article > 正文

【python】各类图像库图片_img.transpose((2, 0, 1))

img.transpose((2, 0, 1))

主流python图像库:

目录

opencv

图片读取: cv2.imread

图片的矩阵格式变换:img.transpose(2,0,1) 

图片归一化:img.astype("float") / 255.0

存储图片:cv2.imwrite

opencv BGR to RGB:cv2.cvtColor(img4,cv2.COLOR_BGR2RGB)

访问像素

ROI操作(region of interest)

通道操作:cv2.imread   cv2.merge

PIL         

图片读写:Image.open

图片转矩阵:np.array

矩阵再转为图像:Image.fromarray

分离合并通道

ROI获取

matplotlib   

   图像读取:plt.imread

scipy.misc   scipy.misc.imread

skimage      skimage.io.imread

总结

 


opencv

图片读取: cv2.imread

opencv读进来的图片已经是一个numpy矩阵了,数据类型是uint8。

  1. import cv2
  2. import numpy as np
  3. #读入图片:默认彩色图,cv2.IMREAD_GRAYSCALE灰度图,cv2.IMREAD_UNCHANGED包含alpha通道
  4. img = cv2.imread('1.jpg')
  5. cv2.imshow('src',img)
  6. print(img.shape)    # (h,w,c)  高度 宽度 通道数
  7. print(img.size)       # 像素总数目
  8. print(img.dtype)      # 数据类型
  9. print(img)

 

 如果转为灰度图:

  1. gray = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
  2. cv2.imshow('gray',gray)

注意,计算图片路径是错的,Opencv也不会提醒你,但print img时得到的结果是None 

图片的矩阵格式变换:img.transpose(2,0,1) 

opencv读入图片的矩阵格式是:(height,width,channels)

而在深度学习中,因为要对不同通道应用卷积,有时候会采取另一种方式:(channels,height,width)

  1. print(img.shape)
  2. img = img.transpose(2,0,1)
  3. print(img.shape)

 

在深度学习搭建CNN时,往往要做相应的图像数据处理,比如图像要扩展维度,比如扩展成:(batch_size,channels,height,width)

  1. #单张
  2. img = np.expand_dims(img, axis=0)
  3. print(img.shape)
  4. #训练集
  5. data_list = []
  6. loop:
  7. im = cv2.imread('xxx.png')
  8.     data_list.append(im)
  9. data_arr = np.array(data_list)

图片归一化:img.astype("float") / 255.0

因为opencv读入的图片矩阵数值是0到255,有时我们需要对其进行归一化为0~1

  1. img3 = cv2.imread('1.jpg')
  2. img3 = img3.astype("float") / 255.0 #注意需要先转化数据类型为float
  3. print(img3.dtype)
  4. print(img3)

存储图片:cv2.imwrite

  1. #存储图片
  2. cv2.imwrite('test1.jpg',img3) #得到的是全黑的图片,因为我们把它归一化了
  3. #所以要得到可视化的图,需要先*255还原
  4. img3 = img3 * 255
  5. cv2.imwrite('test2.jpg',img3) #这样就可以看到彩色原图了

opencv BGR to RGB:cv2.cvtColor(img4,cv2.COLOR_BGR2RGB)

opencv对于读进来的图片的通道排列是BGR

  1. #opencv读入的矩阵是BGR,如果想转为RGB,可以这么转
  2. img4 = cv2.imread('1.jpg')
  3. img4 = cv2.cvtColor(img4,cv2.COLOR_BGR2RGB)

访问像素

  1. #访问像素
  2. print(img4[10,10]) #3channels
  3. print(gray[10,10]) #1channel
  4. img4[10,10] = [255,255,255]
  5. gray[10,10] = 255
  6. print(img4[10,10]) #3channels
  7. print(gray[10,10]) #1channel

ROI操作(region of interest)

  1. #roi操作
  2. roi = img4[200:550,100:450,:]
  3. cv2.imshow('roi',roi)
  4. cv2.waitKey()

通道操作:cv2.imread   cv2.merge

  1. #分离通道
  2. img5 = cv2.imread('1.jpg')
  3. b,g,r = cv2.split(img5)
  4. #合并通道
  5. img5 = cv2.merge((b,g,r))
  6. #也可以不拆分
  7. img5[:,:,2] = 0 #将红色通道值全部设0

 

PIL:PIL.Image.open

  Python Imaging Library,是一个很流行的图像库,比opencv更为轻巧,比较受欢迎。

  1. from PIL import Image
  2. import numpy as np

图片读写:Image.open

PIL读进来的图像是一个对象,而不是我们所熟知的numpy矩阵。

  1. img = Image.open('1.jpg')
  2. print(img.format) # 图片格式
  3. print(img.size) # 注意,省略了通道 (w,h)
  4. print(img.mode) # L为灰度图,RGB为真彩色,RGBA为加了透明通道
  5. img.show() # 显示图片

如果需要灰度图

  1. gray = Image.open('1.jpg').convert('L')
  2. gray.show()

 读取不到图片会抛出异常IOError,我们可以捕捉它,做异常处理

  1. try:
  2. img2 = Image.open('2.jpg')
  3. except IOError:
  4. print('fail to load image!')

图片转矩阵:np.array

pillow读进来的图片不是矩阵,我们将图片转矩阵, channel last 

  1. arr = np.array(img3)
  2. print(arr.shape)
  3. print(arr.dtype)
  4. print(arr)

灰度图的转化与彩图转化一样

  1. arr_gray = np.array(gray)
  2. print(arr_gray.shape)
  3. print(arr_gray.dtype)
  4. print(arr_gray)

存储图片

矩阵再转为图像:Image.fromarray

  1. new_im = Image.fromarray(arr)
  2. new_im.save('3.png')

分离合并通道

  1. r, g, b = img.split()
  2. img = Image.merge("RGB", (b, g, r))
img = img.copy() #复制图像

ROI获取

  1. img3 = Image.open('1.jpg')
  2. roi = img3.crop((0,0,300,300)) #(左上x,左上y,右下x,右下y)坐标
  3. roi.show()

 

matplotlib:matplotlib.image.imread

matplotlib是一个科学绘图神器,用的人非常多。

  1. import matplotlib.pyplot as plt
  2. import numpy as np

图像读取:plt.imread

  1. image = plt.imread('1.jpg')
  2. plt.imshow(image)
  3. plt.show()

也可以关闭显示x,y轴上的数字 

  1. image = plt.imread('1.jpg')
  2. plt.imshow(image)
  3. plt.axis('off')
  4. plt.show()

plt.imread读入的就是一个矩阵,跟opencv一样,但彩图读进的是RGB,与opencv有区别 

  1. print(image.shape) # (h,w,c)
  2. print(image.size)
  3. print(image.dtype)
  4. print(image)

  1. im_r = image[:,:,0] #红色通道
  2. plt.imshow(im_r)
  3. plt.show()
  4. #此时会发现显示的是热量图,不是我们预想的灰度图,可以添加 cmap 参数解决
  5. plt.imshow(im_r,cmap='Greys_r')
  6. plt.show()

plt与opencv结合使用

  1. import cv2
  2. im2 = cv2.imread('1.jpg')
  3. plt.imshow(im2)
  4. plt.axis('off')
  5. plt.show()
  6. #发现图像颜色怪怪的,原因是RGB顺序不同
  7. im2 = cv2.cvtColor(im2,cv2.COLOR_BGR2RGB)
  8. plt.imshow(im2)
  9. plt.axis('off')
  10. plt.show()
  11. #所以无论用什么库读进图片,只要把图片改为矩阵,那么matplotlib就可以处理了

再试一试pillow和matplotlib结合 

  1. from PIL import Image
  2. im3 = Image.open('1.jpg')
  3. im3 = np.array(im3)
  4. plt.figure(1)
  5. plt.imshow(im3)
  6. plt.axis('off')
  7. #存储图像,注意,必须在show之前savefig,否则存储的图片一片空白
  8. plt.savefig('timo.jpg')
  9. plt.show()

  1. #最后以一个综合例子总结matplotlib最基本的图片显示技巧吧
  2. im_lol1 = plt.imread('lol.jpg')
  3. im_lol2 = plt.imread('1.jpg')
  4. figure = plt.figure(figsize=(20,10)) # 调整显示图片的大小
  5. '''
  6. figsize参数:指定绘图对象的宽度和高度,单位为英寸;dpi参数指定绘图对象的分辨率,
  7. 即每英寸多少个像素,缺省值为80。因此本例中所创建的图表窗口的宽度为8*80 = 640像素
  8. '''
  9. plt.axis("off")#不显示刻度
  10. ax = figure.add_subplot(121) # 图片以12列的形式显示
  11. plt.axis('off')
  12. ax.imshow(im_lol1) #第一张图
  13. ax.set_title('lol image 1')#给图片加titile
  14. ax = figure.add_subplot(122)
  15. plt.axis('off')
  16. ax.imshow(im_lol2)
  17. ax.set_title('lol image 2')#给图片加titile
  18. plt.savefig('twp.jpg')
  19. plt.show()

scipy.misc:scipy.misc.imread

  1. from scipy import misc
  2. import matplotlib.pyplot as plt
  1. im = misc.imread('1.jpg')
  2. print(im.dtype)
  3. print(im.size)
  4. print(im.shape)
  5. misc.imsave('misc1.png',im)
  6. plt.imshow(im)
  7. plt.show()
  8. print(im)

可以看到,有warining,提示我们imread和imsave在后来的版本将会被弃用,叫我们使用imageio.imread和imageio.imwrite。

根据提示,使用imageio模块进行图片读写,warning也就没有了。

  1. import imageio
  2. im2 = imageio.imread('1.jpg')
  3. print(im2.dtype)
  4. print(im2.size)
  5. print(im2.shape)
  6. plt.imshow(im)
  7. plt.show()
  8. print(im2)
  9. imageio.imsave('imageio.png',im2)

 

skimage:skimage.io.imread

  1. from skimage import io
  2. im = io.imread('1.jpg')
  3. print(im.shape) # numpy矩阵,(h,w,c)
  4. print(im.dtype)
  5. print(im.size)
  6. io.imshow(im)
  7. io.imsave('sk.png',im)
  8. print(im)

图像也是以numpy array形式读入。

灰度图的获取方式:

  1. im2 = io.imread('1.jpg',as_grey=True) #读入灰度图
  2. print(im2.dtype)
  3. print(im2.size)
  4. print(im2.shape)
  5. io.imshow(im2)
  6. io.imsave('sk_gray.png',im2)
  7. io.show()
  8. print(im2)

可以看到,灰度图像的矩阵的值被归一化了,注意注意!

也可以以这种方式获得灰度图:

  1. from skimage import color
  2. im3 = io.imread('1.jpg')
  3. im3 = color.rgb2grey(im3)
  4. print(im3.dtype)
  5. print(im3.size)
  6. print(im3.shape)
  7. io.imshow(im3)
  8. io.show()
  9. '''
  10. skimage.color.rgb2grey(rgb)
  11. skimage.color.rgb2hsv(rgb)
  12. skimage.color.rgb2lab(rgb)
  13. skimage.color.gray2rgb(image)
  14. skimage.color.hsv2rgb(hsv)
  15. skimage.color.lab2rgb(lab)
  16. '''

总结

  1. 除了opencv读入的彩色图片以BGR顺序存储外,其他所有图像库读入彩色图片都以RGB存储。

  2. 除了PIL读入的图片是img类之外,其他库读进来的图片都是以numpy矩阵。

  3. 各大图像库的性能,opencv无论是速度还是图片操作的全面性,都属于碾压的存在,毕竟他是一个巨大的cv专用库。下图为各个主流图像库的一些性能比较图。

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

闽ICP备14008679号