php 读取图片bgr,快速解决cv2.imread()读取图像为BGR的问题

opencv读取图像为b,g,r方法,比如

img = cv2.imread("xx.jpg")

cv2.imshow("xx",img)

展示的结果是正常的:

459e9e91bcdaeaddb71e712dfd711007.png

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

b71a4a0ac8eb46a53720f3e9bb3f6414.png

因为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错误:

8e2d0ef1e27623f836f71b9eb293971f.png

补充:盘点踩过的关于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许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值