添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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图像格式相互转换

Numpy与Opencv格式互转

参照 资料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)
<class 'numpy.ndarray'>

存储类型为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)
<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进行解决。

IPL.Image与Opencv相互转换

先复习一下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)

PIL.Image与Numpy格式的相互转换

相当于 Opencv与PIL.Image的相互转换少了通道的变换。

  • Numpy转PIL.Image
import cv2
from PIL import Image  
import numpy 
array = np.ones(100, 200)
Image.fromarray(array)  
  • PIL.Image转Numpy
import cv2
from PIL import Image
import numpy 
image = Image.open("Messi.jpg")
array = numpy.asarray(image)

参考资料6

list与tuple转换

a = [1, 2, 3]#a is a list
b = tuple(a) # b is a tuple
c = list(b) # c is a list

list,tuple,ndarray转换

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

torch的tensor与numpy转换

# tensor 转numpy
array = a.numpy() # a is a tensor
# numpy 转tensor
torch.from_numpy(array) # array is a ndarray
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读取图像并显示 opencvImage Image读取和显示图像 Imagenumpy Imageopencv opencv读取图像并显示 import cv2 from PIL import Image img = cv2.i
将Python的OpenCVPILnumpy和base64互相转换可以使用以下步骤: 1. 将图像从文件中读取到内存中,使用OpenCVPIL中的一个库。 2. 将图像转换numpy数组。 3. 使用numpy数组进行图像处理。 4. 将numpy数组转换PIL图像或OpenCV图像。 5. 将PIL图像或OpenCV图像转换为base64编码的字符串。 6. 将base64编码的字符串转换PIL图像或OpenCV图像。 7. 将PIL图像或OpenCV图像转换numpy数组。 以下是一个示例代码,可用于将图像从文件中读取,转换numpy数组,对其进行处理,然后将其转换PIL图像并将其保存到文件中: import cv2 from PIL import Image import numpy as np import base64 # 读取图像到numpy数组 img = cv2.imread('image.jpg') img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img_array = np.array(img) # 对图像进行处理 # ... # 将numpy数组转换PIL图像 pil_img = Image.fromarray(img_array) # 将PIL图像保存到文件中 pil_img.save('new_image.jpg') # 将PIL图像转换为base64编码的字符串 with open('new_image.jpg', 'rb') as f: img_base64 = base64.b64encode(f.read()).decode('utf-8') # 将base64编码的字符串转换PIL图像 img_data = base64.b64decode(img_base64) pil_img = Image.open(io.BytesIO(img_data)) # 将PIL图像转换numpy数组 img_array = np.array(pil_img) 青涩小脸蛋: 你好,我想问一下PIL转opencv时报错 image=cv2.cvtColor(image,cv2.COLOR_RGB2BGR) cv2.error: OpenCV(3.4.2) c:\projects\opencv-python\opencv\modules\imgproc\src\color.hpp:253: error: (-215:Assertion failed) VScn::contains(scn) && VDcn::contains(dcn) && VDepth::contains(depth) in function 'cv::CvtHelper<struct cv::Set<3,4,-1>,struct cv::Set<3,4,-1>,struct cv::Set<0,2,5>,2>::CvtHelper'是什么问题? Region Attention Networks for Pose and Occlusion Robust Facial Expression Recognition文章解读 学习编程的小白白: 这个代码有一些具体提示吗,不知道怎么运行,博主有没有相关的数据集 非root用户编译安装GCC 菜鸟的追梦旅行: make[2]: Leaving directory `/home/imdb/gcc-4.8.2/gcc-build-4.8.2' make[1]: *** [stage1-bubble] 错误 2 make[1]: Leaving directory `/home/imdb/gcc-4.8.2/gcc-build-4.8.2' make: *** [all] 错误 2 make 编译gcc的时候出现这个问题,请问博主遇到过吗 Region Attention Networks for Pose and Occlusion Robust Facial Expression Recognition文章解读 Risas: 我想问问这个应该怎么用呀,代码看不太懂 计算理论学习笔记(一) Yyk222: