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
)
)
shape:(500, 500, 3)
<class 'numpy.ndarray'>
存储类型为numpy.ndarray,这是否表明numpy与Opencv可以直接互操作呢?答案是否定的。因为图像存放时,每个像素值都是非负的,并且取值范围受限于存储位数的限制,所以将numpy.ndarray存储为图像格式,需要先将其进行类型转换。
array = np.ones([20, 30])
print("shape:" + str(array.shape))
print(type(array))
类型转换时需注意,我参照博客转成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)
<class 'numpy.ndarray'>
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的读,写,显示
img = cv2.imread('Messi.jpg')
cv2.imwrite('Messi2.jpg', img)
cv2.imshow('Messi', img)
img = Image.open('Messi.jpg')
img.save('Messi3.jpg')
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]
b = tuple(a)
c = list(b)
a = [1, 2, 3]
arr = np.array(a)
b = tuple(arr)
a = (1, 2, 3)
arr = np.arr(a)
b = list(arr)
array = a.numpy()
torch.from_numpy(array)
img = Image.open(filepath)
img_convert_ndarray = np.array(img)
ndarray_convert_img= Image.fromarray(img_convert_ndarray )
# np.array(object) 这个函数很强大啊,看源码里面给的注释
# object : array_like
# An array, any object exposing the array interface, an object wh
img = cv2.imread(imgfile, cv2.IMREAD_GRAYSCALE)
print(cv2.imread(imgfile, cv2.IMREAD_GRAYSCALE)结果如下:)
print('大小:{}'.forma
img = cv2.imread("plane.jpg")
cv2.imshow("OpenCV",img)
image = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
image.show()
cv2.waitKey()
PIL.Image转换成OpenCV格式:
import cv2
from PIL import Image
import numpy
image = Image.op
opencv的数据格式就是用numpy unit8 格式存储的。两者之间可以相互装换;
想用imshow格式输出,array格式一定用转换为uint8的格式。用array.astype(np.uint8)强制转换为uint8的格式。
对于彩色图像有三个通道,每一个通道都是一样的操作,最后用cv2.merge(r,g,b)函数将三个通道的值何在一起就行。
import cv2 as cv
import numpy as np
filename = 'A.jpg'
图像的显示在python中有很多方式,但针对自己的项目,需要有不同的读取或者显示方式,又或者想把图像转换成其他类型进行处理。比如你是用opencv读取的图像,然后检测完以后是用Image.show()显示的,类似这种就需要进行转换了。
opencv读取图像并显示
opencv转Image
Image读取和显示图像
Image转numpy
Image转opencv
opencv读取图像并显示
import cv2
from PIL import Image
img = cv2.i