在学习VGG16网络及U-Net网络时都涉及到图像的读取。
参考博客:Python各类图像库的图片读写方式总结
OpenCV与Python之图像的读入与显示以及利用Numpy的图像转换
import cv2
import numpy as np
#读入图片:默认彩色图,cv2.IMREAD_GRAYSCALE灰度图,cv2.IMREAD_UNCHANGED包含alpha通道
img = cv2.imread('1.jpg')
cv2.imshow('src',img)
print(img.shape) # (h,w,c)
print(img.size) # 像素总数目
print(img.dtype)
print(img)
# waitKey参数为0的时候窗口不会自动关闭,无限等待按键,假如设为10000,也就是10s,不做任何操作的情况# 下大概15s左右窗口自动关闭
cv2.waitKey()
值得注意的是,opencv读进来的图片已经是一个numpy矩阵了,彩色图片维度是(高度,宽度,通道数)。数据类型是uint8,
注意:opencv对于读进来的图片的通道排列是BGR,而不是主流的RGB!谨记!
PIL读取图片后的像素值是RGB,首先使用PIL读取图片,得到第一个位置的像素值[R,G,B]
from PIL import Image
img = Image.open("1.jpg")
print(img.size)
print(img.getpixel((0,0)))
再使用opencv读取图像,注意其已经是numpy数组,且其img.size为总像素数
import cv2
img = cv2.imread('1.jpg')
print(img.shape)
print(img[0][0])
若要cv2读取完图像也是RGB格式,则有如下几种方法:
# 方法一,直接这样写
img = cv2.imread("1.jpg")[:,:,::-1]
# 或者这样写
img = cv2.imread('1.jpg')
img3=img[:,:,::-1]
# 方法二
img = cv2.imread("1.jpg")
b,g,r=cv2.split(img)
img2=cv2.merge([r,g,b])
print(img2.shape)
print(img2[0][0])
# 方法三
img4=cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
print(img4.shape)
print(img4[0][0])
对于方法一利用numpy数组切片转化方法,可以这么举例理解:
仿照图片的像素格式,建立一个2行3列的,每个像素有包含RGB3个元素。
分别进行图中所示的4种运算。
执行a[:-1],移除了后面的一行。对于一维数组,后面的一行其实就是最后一个元素,所以这个运算就是移除最后一个元素。
执行a[::-1],上下两行交换了。同样的看成一维数组的话,一行就是一个元素,这个运算其实就是对一个一维数组内的元素前后对调。多维数组可以理解成对对第一个方括号内的每一个元素前后对调。
执行a[:,::-1],每一行中的元素前后交换了。简单理解就是对第二层反括号内的元素前后对调。
执行a[:,:,::-1],这样就好理解了,肯定是对第三层方括号内的元素对调。这也就解释了,对于一个24位深度的图像执行这个操作的话,是对每个像素的RGB进行对调。
对于图像而言,a[::-1],a[:,::-1],a[:,:,::-1]上述的三种方法分别是X轴的镜像,Y轴的镜像,BGR转换为RGB的操作。
另一篇参考博文的说法:OpenCV-MAT对象中使用pylab.imshow(img[:,:,::-1])如何实现将第二轴反向
img[:,:,::-1]
中括号中有两个逗号,四个冒号
[:,:,::-1]
第一个冒号——取遍图像的所有行数
第二个冒号——取遍图像的所有列数
第三个和第四个冒号——取遍图像的所有通道数,-1是反向取值
所以,如果一幅300*100的彩色图像,
执行img[:,:,::-1]后行列不变,通道数方向,由R、G、B更改为B、G、R,即第二轴反向
若是执行img[1:4,5:10,1:3:-1]后,第1行到第3行,第5列到第9列,第1通道到第2通道上的数据反向,即——第1行到第3行,第5列到第9列由R、G、B更改为R、B、G
import cv2
#读入图片:默认彩色图,cv2.IMREAD_GRAYSCALE灰度图,cv2.IMREAD_UNCHANGED包含alpha通道
img = cv2.imread('1.jpg')
cv2.imshow('src',img)
cv2.waitKey(0)
# 该方法将img缩放为32*32尺寸大小的图片
img5=cv2.resize(img,(32,32))
cv2.imshow('src',img5)
cv2.waitKey(0)
# 注意用imshow显示图像要用cv2.waitKey(0),不然显示不出来
# 使用cv2.resize时,参数输入是 宽×高×通道