图像读取的几种方式(cv2, Image, plt都能加载图像,到底有啥区别呢?)
收藏
你有遇到过以下情况吗,本来一张图片在自己电脑中打开是这样的:
但是用OpenCV打开之后确是这样的:
有没有一瞬间怀疑是自己电脑屏幕出现了问题?别慌,这其实都是OpenCV加载图片的方式导致的。
我们去看CV2.imread()的官方文档发现:
看到这里大概明白了吧。这是因为cv2.imread()接口读进来的图像是BGR格式的,而我想要显示的彩色图像是RGB格式的,所以会显示蓝色居多,其实在cv2中也有对应的方法将读取进来的img进一步类型转换,将其变为RGB图像:
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
在做图像处理的时候,常用的图像读取方式大概有三种:
- OpenCV 的 imread方法
- matplotlib 中 的 imread方法
- Image 的 open 方法
这三种方式都能将图像加载进来,那么它们之间到底有啥却别呢?
# 我们以最经典的lena 作为示例 img_path = 'work/lena.jpg' fig = plt.figure(figsize=(8,8)) ax1 = fig.add_subplot(131) ax1.set_title("plt.imread") img1 = plt.imread(img_path) ax1.imshow(img1) ax2 = fig.add_subplot(132) ax2.set_title("cv2.imread") img2 = cv2.imread(img_path) ax2.imshow(img2) ax3 = fig.add_subplot(133) ax3.set_title("Image.open") img3 = Image.open(img_path) ax3.imshow(img3)
我们可以看出来,plt和Image.open都能显示正常的图片,而cv2显示的偏蓝色。这是因为cv2是BGR,而其余两个是RGB格式。
然后,我们看这三个的数据格式发现,plt和cv2读取后都是numpy.ndarray的格式,而Image.open 读取后的是一个数组,需要使用numpy.array()转换后,才能和plt和cv2读取后的格式一样。
总结一下:
cv2.imread | plt.imread | Image.open | |
类型 | numpy.ndarray | numpy.ndarray | PIL.JpegImagePlugin.JpegImageFile |
图像格式 | BGR | RGB | 数组 |
2
收藏
请登录后评论
不错,受益匪浅,加个好友吧