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

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

(0)

相关推荐

  • Python实现计算图像RGB均值方式

    要求 存在一个文件夹内有若干张图像,需要计算每张图片的RGB均值,并计算全部图像的RGB均值. 代码 # -*- coding: utf-8 -*- """ Created on Thu Nov 1 10:43:29 2018 @author: Administrator """ import os import cv2 import numpy as np path = 'C:/Users/Administrator/Desktop/rgb'

  • 解决python cv2.imread 读取中文路径的图片返回为None的问题

    使用cv2读取图片时,输出图片形状大小时出现报错" 'NoneType' object has no attribute shape",后来排查发现读取图片的返回值image为None, 这就说明图片根本就没有被读取. 下面图片是问题问题解决后,为了更好的展示,写的代码展示,这是正常的因果关系,找错误排查时是从下往上推. 使用PIL读取图像,能够成功读取图片,借此了解图片的大小和格式,代码如下图所示: cv.imread函数能够成功读取非中文路径的图片,所以就想到是不是中文路径的问题,

  • opencv-python的RGB与BGR互转方式

    一.格式转换 opencv读取图片的默认像素排列是BGR,需要转换.PIL库是RGB格式. caffe底层的图像处理是基于opencv,其使用的颜色通道顺序与也是BGR(Blue-Green-Red),而日常图片存储时颜色通道顺序是RGB. 在Python中,将RGB顺序的图像转成BGR顺序,需要调整channel dimension的各颜色通道顺序. 方法1: img = cv2.imread("001.jpg") img_ = img[:,:,::-1].transpose((2,

  • 快速解决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

  • 解决plt.imshow显示cv2.imread读取的图像有色差发蓝的四种方法问题

    目录 原图 一.出现色差代码 1.1 显示彩色图像出现色差 1.2 显示灰度图像出现色差 二.解释原因 2.1 彩色图像出现色差原因 2.2 灰度图像出现色差原因 三.解决 3.1 解决彩色图像出现色差问题 3.2 解决灰度图像出现色差问题 原图 一.出现色差代码 1.1 显示彩色图像出现色差 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('dog.jpg') plt.xticks([

  • PIL.Image.open和cv2.imread的比较与相互转换的方法

    摘要 PIL.Image.open读入的是RGB顺序,而opencv中cv2.imread读入的是BGR通道顺序 .cv2.imread会显示图片更蓝一些. cv2.imread(path,读取方式)方法 第一个参数是图片的路径. 第二个参数是读取方式:cv2.IMREAD_COLOR:读入一副彩色图片:cv2.IMREAD_GRAYSCALE:以灰度模式读入图片:cv2.IMREAD_UNCHANGED:读入一幅图片,并包括其alpha通道. 默认为cv2.IMREAD_COLOR. 返回值是

  • 解决Python3.5+OpenCV3.2读取图像的问题

    由于编码原因,opencv3.2无法用imread\imwrite直接读写含有中文字符的图像路径, 因此读写要用以下2个方法: import cv2 as c import numpy as np img=c.imdecode(np.fromfile(path,dtype=np.uint8),0) # 读.最后一个参数:0-灰度,1-彩色 c.imencode('.jpg',img)[1].tofile(path1) # 写 以上这篇解决Python3.5+OpenCV3.2读取图像的问题就是小

  • OpenCV中C++函数imread读取图片的问题及解决方法

    今天在用OpenCV实验Image Pyramid的时候发现一个奇怪的问题,就是利用C++函数imread读取图片的时候返回的结果总是空,而利用C函数cvLoadImage时却能读取到图像.代码如下: //环境:VS2010 + OpenCV 2.3.1 #include "stdafx.h" #include <cv.h> #include <highgui.h> #include <math.h> #include <stdlib.h>

  • OpenCV imread读取图片失败的问题及解决

    目录 OpenCV imread读取图片失败问题 OpenCV读图失败的三种情况,其中一种情况罕见 一.Windows粘贴可能存在非法字符 二.路径斜杠的问题 三.附加依赖项的原因 OpenCV imread读取图片失败问题 使用一下代码读取一张图片失败(不管是绝对路径还是相对路径,都失败),工程运行都没问题,就是图片读取失败. // 读入一张图片(游戏原画) Mat img=imread("hehe.jpg"); if(!img.data) //判断图片调入是否成功 return -

  • pytorch读取图像数据转成opencv格式实例

    pytorch读取图像数据转成opencv格式方法:先转成numpy通用的格式,再将其转换成opencv格式. pytorch读取的数据使用loaddata这类函数实现.pytorch网络输入图像的格式为(C, H, W),就是(通道数,高,宽)而numpy中图像的格式为(H,W,C). 那就将其通道调换一下.用到函数transpose. 转换方法如下 例如A 的格式为(c,h,w) 那么经过 A = A.transpose(1,2,0) 后就变成了(h,w,c)了 然后用语句 B= cv2.c

  • Python-OpenCV:cv2.imread(),cv2.imshow(),cv2.imwrite()的区别

    目录 为什么使用Python-OpenCV? 基本操作 1.图像读入 2.显示图片 3.保存图片 变换操作 1.翻转图片 2.复制图片 3.颜色空间转换 4.裁剪图片 综合示例 参考链接: 为什么使用Python-OpenCV? 虽然python 很强大,而且也有自己的图像处理库PIL,但是相对于OpenCV 来讲,它还是弱小很多.跟很多开源软件一样OpenCV 也提供了完善的python 接口,非常便于调用.OpenCV 的最新版是4.0,包含了超过2500 个算法和函数,几乎任何一个能想到的

  • opencv-python 读取图像并转换颜色空间实例

    我就废话不多说了,直接上代码吧! #-*- encoding:utf-8 -*- ''' python 绘制颜色直方图 ''' import cv2 import numpy as np from matplotlib import pyplot as plt def readImage(): #读取图片 B,G,R,返回一个ndarray类型 #cv2.IMREAD_COLOR # 以彩色模式读入 1 #cv2.IMREAD_GRAYSCALE # 以灰色模式读入 0 img = cv2.im

随机推荐