1.Python OpenCV中的numpy与图像类型转换
2. 解决ndarray的类型错误
3. Python OpenCV格式和PIL.Image格式 互转
4. python模块 | opencv-python与PIL.Image图像常用方法与相互转换
5. OpenCV读取图片与PIL读取图片的差别
6. python中PIL.Image,OpenCV,Numpy图像格式相互转换
参照资料1
Python OpenCV存储图像使用的是Numpy存储,所以可以将Numpy当做图像类型操作,操作之前还需进行类型转换,转换到int8类型
对Opencv存储的图像格式进行验证
"""
numpy与Opencv图像类型的转换
> Python OpenCV存储图像使用的是Numpy存储,所以可以将Numpy当做图像类型操作,操作之前还需进行类型转换,转换到int8类型
"""
import cv2
import numpy as np
from PIL import Image
img = cv2.imread('./Messi.jpg')
print("shape:" + str(img.shape))
print(type(img)) #数据类型显示为numpy.ndarray
shape:(500, 500, 3)
存储类型为numpy.ndarray,这是否表明numpy与Opencv可以直接互操作呢?答案是否定的。因为图像存放时,每个像素值都是非负的,并且取值范围受限于存储位数的限制,所以将numpy.ndarray存储为图像格式,需要先将其进行类型转换。
array = np.ones([20, 30])
print("shape:" + str(array.shape))
print(type(array)) #数据类型显示numpy.ndarray 与Opencv图像类型格式相同
# 可以将ndarray作为Opencv图片进行处理,但在处理之前一般进行类型转换
"""
类型转换时需注意,我参照博客转成int8类型,可以写入,但是单通道转多通道会出错
Assertion failed) VScn::contains(scn) && VDcn::contains(dcn) && VDepth::contains(depth) in function 'CvtHelper'
参照github是类型错误导致的
"""
array = np.uint8(array)
print("shape:" + str(array.shape))
cv2.imwrite('test.jpg', array)
# 类型转换
array = cv2.cvtColor(array, cv2.COLOR_GRAY2BGR)
print("shape:" + str(array.shape))
cv2.imwrite('test2.jpg', array)
shape:(20, 30)
shape:(20, 30)
shape:(20, 30, 3)
正如注释所写,类型转换时,要注意,我参照资料1转为int8,在通道转换时出现了错误Assertion failed) VScn::contains(scn) && VDcn::contains(dcn) && VDepth::contains(depth) in function ‘CvtHelper’,参照资料2进行解决。
先复习一下Opencv与IPL.Image的读,写,显示
"""
Opencv 图像的读,写,显示
PIL.Image的读,写,显示
"""
# Opencv读
img = cv2.imread('Messi.jpg')
# Opencv写
cv2.imwrite('Messi2.jpg', img)
# Opencv显示
cv2.imshow('Messi', img)
# PIL.Image读
img = Image.open('Messi.jpg')
# PIL.Image写
img.save('Messi3.jpg')
# PIL.Image显示
img.show()
Image.open()读取的通道顺序是RGB,cv2.imread()读取的通道顺序为BGR。
Image.open()函数只是保持了图像被读取的状态,但是图像的真实数据并未被读取,因此如果对需要操作图像每个元素,如输出某个像素的RGB值等,需要执行对象的load()方法读取数据
PIL.Image.save()直接保存RGB的图片 cv2.imwirte()保存图片的时候相当于做了BGR2RGB再去保存
OpenCV转换成PIL.Image格式
import cv2
from PIL import Image
import numpy
img = cv2.imread("Messi.jpg")
cv2.imshow("OpenCV",img)
Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
PIL.Image转换成OpenCV格式:
import cv2
from PIL import Image
import numpy
image = Image.open("Messi.jpg")
img = cv2.cvtColor(numpy.asarray(image),cv2.COLOR_RGB2BGR)
相当于 Opencv与PIL.Image的相互转换少了通道的变换。
import cv2
from PIL import Image
import numpy
array = np.ones(100, 200)
Image.fromarray(array)
import cv2
from PIL import Image
import numpy
image = Image.open("Messi.jpg")
array = numpy.asarray(image)
参考资料6
a = [1, 2, 3]#a is a list
b = tuple(a) # b is a tuple
c = list(b) # c is a list
a = [1, 2, 3] # a is a list
arr = np.array(a) # arr is a ndarray
b = tuple(arr) # b is a tuple
a = (1, 2, 3)# a is a tuple
arr = np.arr(a) # arr is a ndarray
b = list(arr) # b is a list
# tensor 转numpy
array = a.numpy() # a is a tensor
# numpy 转tensor
torch.from_numpy(array) # array is a ndarray