快速解决cv2.imread()读取图像为BGR的问题
opencv读取图像为b,g,r方法,比如
img = cv2.imread("xx.jpg")
cv2.imshow("xx",img)
展示的结果是正常的:

但是此时读取到的img已经为bgr方式了,如果我们再用其他使用rgb方式读取的函数进行读取时就会出错,比如我用plt对图像进行显示,效果如下:

因为plt函数是rgb方式读取的,所以会出错。这时我们可以手动改变img的通道顺序,如下:
b,g,r = cv2.split(img) img_rgb = cv2.merge([r,g,b]) plt.figure() plt.imshow(img_rgb) plt.show()
这时img_rgb就是rgb顺序的了.那么这时再用cv2.imshow()显示出来,rgb错误:

补充:盘点踩过的关于cv2 和PIL 图像读取的一些小坑
1、首先像素读取顺序不同
PIL 读取图像时的像素顺序是标准的RGB
from PIL import Image
img = Image.open("test.jpg")
print img.size
print img.getpixel((0,0))
输出结果是
(533, 800) (217, 229, 225)
cv2 读取图像时的像素顺序是标准的BGR
img = cv2.imread(""test.jpg"")
print img.shape
print img[0][0]
输出结果是
(800, 533, 3) [225 229 217]
若要cv2读取完图像也是RGB格式,则按如下方法
img = cv2.imread(""test.jpg"")[..., ::-1]
print img.shape
print img[0][0]
输出结果是
(800, 533, 3) [217 229 225]
和用PIL 读取完的一致
2、cv2 图像读取方法的参数解释
首先我们先来看一下这个函数的定义
def imread(filename, flags=None)
filename
参数传入的是图像路径,支持解析的图像格式基本上覆盖全了
- Windows bitmaps - \*.bmp, \*.dib (always supported) - JPEG files - \*.jpeg, \*.jpg, \*.jpe (see the *Note* section) - JPEG 2000 files - \*.jp2 (see the *Note* section) - Portable Network Graphics - \*.png (see the *Note* section) - WebP - \*.webp (see the *Note* section) - Portable image format - \*.pbm, \*.pgm, \*.ppm \*.pxm, \*.pnm (always supported) - Sun rasters - \*.sr, \*.ras (always supported) - TIFF files - \*.tiff, \*.tif (see the *Note* section) - OpenEXR Image files - \*.exr (see the *Note* section) - Radiance HDR - \*.hdr, \*.pic (always supported) - Raster and Vector geospatial data supported by GDAL (see the *Note* section)
flags
@param flags Flag that can take values of cv::ImreadModes
Flags指定了所读取图片的颜色类型, 默认值为1
对应值为 -1 到 4
| 参数 | Value |
|---|---|
| IMREAD_UNCHANGED | If set, return the loaded image as is (with alpha channel, otherwise it gets cropped). |
| IMREAD_GRAYSCALE | If set, always convert image to the single channel grayscale image. |
| IMREAD_COLOR | If set, always convert image to the 3 channel BGR color image. |
| IMREAD_ANYDEPTH | If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit. |
| IMREAD_ANYCOLOR | If set, the image is read in any possible color format. |
| IMREAD_LOAD_GDAL | If set, use the gdal driver for loading the image. |
| 参数 | Value |
|---|---|
| flag=-1时 | 8位深度,原通道 |
| flag=0 | 8位深度,1通道 |
| flag=1 | 8位深度 ,3通道 |
| flag=2 | 原深度,1通道 |
| flag=3 | 原深度,3通道 |
| flag=4 | 8位深度 ,3通道 |
IMREAD_UNCHANGED :不进行转化,比如保存为了16位的图片,读取出来仍然为16位。
IMREAD_GRAYSCALE :进行转化为灰度图,比如保存为了16位的图片,读取出来为8位,类型为CV_8UC1。
IMREAD_COLOR :进行转化为三通道图像。
IMREAD_ANYDEPTH :如果图像深度为16位则读出为16位,32位则读出为32位,其余的转化为8位。
IMREAD_ANYCOLOR :
IMREAD_LOAD_GDAL :使用GDAL驱动读取文件,GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
相关文章
python程序运行进程、使用时间、剩余时间显示功能的实现代码
这篇文章主要介绍了python程序运行进程、使用时间、剩余时间显示功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧2019-07-07
Python3 Post登录并且保存cookie登录其他页面的方法
今天小编就为大家分享一篇Python3 Post登录并且保存cookie登录其他页面的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-12-12
在Sublime Editor中配置Python环境的详细教程
这篇文章主要介绍在sublime编辑器中安装python软件包,以 实现自动完成等功能,并在sublime编辑器本身中运行build,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧2020-05-05
python将MongoDB里的ObjectId转换为时间戳的方法
这篇文章主要介绍了python将MongoDB里的ObjectId转换为时间戳的方法,涉及Python操作MongoDB及字符串转换的技巧,具有一定参考借鉴价值,需要的朋友可以参考下2015-03-03
Python Threading 线程/互斥锁/死锁/GIL锁
这篇文章主要介绍了Python Threading 线程/互斥锁/死锁/GIL锁的相关知识,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下2019-07-07


最新评论