最近在做项目,不得不说,项目是真的锻炼人····
用到最多的是opencv,opencv上手容易是容易,但是坑也不少,突然心血来潮想记录一下。
首先图片的读取就有两种方式,一种是使用PIL库:
from PIL import Image
img = Image.open(r'E:\MBY\dog.jpg')
img.show()
from PIL import Image
img = Image.open(r'E:\MBY\dog.png')
img.show()
看起来并没有什么不同,但第一张是jpg格式,第二章是png形式,jpg与png最大的区别就是,jpg图片有三个通道,即R、G、B通道,png比起jpg则是多增加了一个Alpha通道。
第二种方式是使用cv2:
import cv2
img = cv2.imread(r'E:\MBY\test\dog.jpg')
cv2.imshow('',img)
cv2.waitKey()
cv2.destroyAllWindows()
import cv2
img = cv2.imread(r'E:\MBY\test\dog.png')
cv2.imshow('',img)
cv2.waitKey()
cv2.destroyAllWindows()
对比一下二者最大的不同:
from PIL import Image
img = Image.open(r'E:\MBY\test\dog.jpg')
print(type(img))
print(img.shape)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
in
2
3 img = Image.open(r'E:\MBY\\dog.jpg')
----> 4 print(img.shape)
AttributeError: 'JpegImageFile' object has no attribute 'shape'
import cv2
import numpy as np
img = cv2.imread(r'E:\MBY\dog.jpg')
cv2.imshow('',img)
cv2.waitKey()
cv2.destroyAllWindows()
print(img.shape)import cv2
print(type(img))
(1335, 2000, 3)
import cv2
import numpy as np
img = cv2.imread(r'E:\MBY\dog.png',cv2.IMREAD_UNCHANGED)
cv2.imshow('',img)
cv2.waitKey()
cv2.destroyAllWindows()
print(img.shape)
(423, 455, 4)
由返回的结果可看出PIL读取方式返回的是PIL.PngImagePlugin.PngImageFile类对象,而cv2读取返回的是数组形式,cv2中如果是三通道返回的就是三维数组,四通道就返回四维数组。若是打印PIL方式读取图片的shape就会抛出错误。
这段时间在做一些跟深度学习有关的项目,其中免不了用到opencv的功能,学了很多,也踩了很多坑,相当于小白上手,猝不及防就遇到PIL读取和CV2读取处理图片,因为cv2很经常用到并且也好用,但是我又想用cv2处理PIL读取之后的图片,一脸懵的我上网搜索才解决了这个问题。其实也很简单:
from PIL import Image
img = Image.open(r'E:\MBY\dog.jpg')
img = np.array(img)
将PIL.PngImagePlugin.PngImageFile类对象转为numpy数组后续的操作才能正常进行。
这还是小问题,当我想要把图片写成视频则又出问题了,之前我用cv2处理图片之后还进行了png与jpg的叠加,然后我将结果保存到文件夹之后写入视频,这很可以,并没有问题,当我嫌中间过程太繁琐,想将图片结果保存在内存中,直接从内存读取并写入视频时,问题又出现了,我的成果视频只有1KB,打开显示文件损坏!!!当时心态就崩了,于是开始尝试拆解代码找出问题的源头,但是它也不报错呀,无奈之下只好请教前辈,前辈在我的思(忽)路(悠)之下,成功被我带偏,于是俩人一起在电脑前挠头。最后把图片的维度打印出来发现,我处理完之后的图片是png形式的,是四维数组,而我cv2从文件夹读取的是三维数组形式,word这个问题真的卡了我好几个小时才发现,一把辛酸泪,维度的丢失导致了我最终成果的失败,当找到原因之后,还真被我找到解决方法:将四维数组转为PIL.PngImagePlugin.PngImageFile类对象,再将PIL.PngImagePlugin.PngImageFile类对象转为numpy三维数组,再写入视频,此时问题又来了·····我做了强制转换丢失了一个通道,且RGB通道没有调整导致我的图片颜色全乱了·······真的心累,最后的解决方法如下:
im = Image.fromarray(cv2.cvtColor(im, cv2.COLOR_BGRA2RGBA))
im = cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR)
最终才成功解决,有些代码和错误被我更新修改掉了,所以都没有留存,只剩正确的········凑合看吧
写这个不仅是发牢骚也是为了记录一点东西,以后再遇到方便自己翻阅·····
第一次写博客没什么经验,瞎写写,有错误欢迎指正。先到这吧,再有东西再放上来咯。