解决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([]), plt.yticks([]) 		#隐藏x轴和y轴

plt.imshow(img)

运行结果:

1.2 显示灰度图像出现色差

img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

plt.xticks([]), plt.yticks([]) # 隐藏x和y轴

plt.imshow(img_gray)

运行结果:

二、解释原因

2.1 彩色图像出现色差原因

使用cv2.imread()读取图像时,默认彩色图像的三通道顺序为B、G、R,这与我们所熟知的RGB中的R通道和B通道正好互换位置了。
而使用plt.imshow()函数却默认显示图像的通道顺序为R、G、B,导致图像出现色差发蓝。

2.2 灰度图像出现色差原因

那么为什么plt.imshow()显示灰度图(只有一个通道)还会出现色差呢?
上一段讲过,这是因为plt.imshow()函数默认显示三通道图像,把灰度图当作彩色图显示出来了,所以出现了发蓝的现象。

三、解决

3.1 解决彩色图像出现色差问题

3.1.1 方法1

img = cv2.imread('dog.jpg')		#读取通道顺序为B、G、R
b,g,r = cv2.split(img)			#分别提取B、G、R通道
img_new1 = cv2.merge([r,g,b])	#重新组合为R、G、B

plt.xticks([]), plt.yticks([]) # 隐藏x和y轴

plt.imshow(img_new1)

运行结果:

3.1.2 方法2

img = cv2.imread('dog.jpg')		#读取通道顺序为B、G、R
#img[:,:,0]表示图片的蓝色通道,对一个字符串s进行翻转用的是s[::-1],同样img[:,:,::-1]就表示BGR通道翻转,变成RGB
img_new2 = img[:, :, ::-1]

plt.xticks([]), plt.yticks([]) # 隐藏x和y轴

plt.imshow(img_new2)

运行结果:

3.2 解决灰度图像出现色差问题

3.2.1 方法1

img = cv2.imread('dog.jpg')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)		#转换为灰度图

plt.xticks([]), plt.yticks([]) # 隐藏x和y轴

plt.imshow(img_gray,cmap='gray')

运行结果:

3.2.2 方法2

#cv2.imread()第二参数为0,直接将彩色图像转换为灰度图像
img = cv2.imread('dog.jpg',0)	

plt.xticks([]), plt.yticks([]) # 隐藏x和y轴

plt.imshow(img_gray,cmap='gray')

运行结果:

到此这篇关于解决plt.imshow显示cv2.imread读取的图像有色差发蓝的四种方法问题的文章就介绍到这了,更多相关plt.imshow显示cv2.imread读取内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python中plt.imshow与cv2.imshow显示颜色问题

    在用plt.imshow和cv2.imshow显示同一幅图时可能会出现颜色差别很大的现象. 这是因为:opencv的接口使用BGR,而matplotlib.pyplot 则是RGB模式 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('lena_std.tif') b,g,r = cv2.split(img) img2 = cv2.merge([r,g,b]) plt.subplot(1

  • 解决python中显示图片的plt.imshow plt.show()内存泄漏问题

    当要处理批量图片,且每张图片都要进行显示时,用plt.imshow() plt.show()会出现内存泄漏, 管理器中看到其中一个python进程的内存不断上涨,目前有找到解决方法 from matplotlib import pyplot as plt ... for...: ... plt.figure(figsize=IMAGE_SIZE) plt.imshow(image_np) plt.show() 补充知识:python在内存中读取base64图片 import base64 imp

  • 解决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([

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

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

  • java读取XML文件的四种方法总结(必看篇)

    JAVA操作XML文档主要有四种方式,分别是DOM.SAX.JDOM和DOM4J,DOM和SAX是官方提供的,而JDOM和DOM4J则是引用第三方库的,其中用的最多的是DOM4J方式.运行效率和内存使用方面最优的是SAX,但是由于SAX是基于事件的方式,所以SAX无法在编写XML的过程中对已编写内容进行修改,但对于不用进行频繁修改的需求,还是应该选择使用SAX. 下面基于这四种方式来读取XML文件. 第一,以DOM的方式实现. package xmls; import org.w3c.dom.D

  • JavaWeb读取配置文件的四种方法

    方式一:采用ServletContext读取 获取配置文件的realpath,然后通过文件流读取出来或者通过方法getReasurceAsStream(). 因为是用ServletContext读取文件路径,所以配置文件可以放入在WEB-INF的classes目录中,也可以在应用层级及WEB-INF的目录中.文件存放位置具体在eclipse工程中的表现是:可以放在src下面,也可放在WEB-INF及Web-Root下面等.因为是读取出路径后,用文件流进行读取的,所以可以读取任意的配置文件包括xm

  • 汇编语言有关在屏幕区显示字符的四种方法(推荐)

    李忠老师的<x86汇编语言:从实模式到保护模式>中第五章到第七章的部分,每一章在讲述知识点的同时,分别使用了三种不同的显示字符的方法,加上调用BIOS的10h中 断的方法,这里做出一次简单梳理: 一:第五章,最基础的直接用mov 的方法 代码如下: ;代码清单5-1 ;文件名:c05_mbr.asm ;文件说明:硬盘主引导扇区代码 ;创建日期:2011-3-31 21:15 mov ax,0xb800 ;指向文本模式的显示缓冲区 mov es,ax ;以下显示字符串"Label of

  • Python 列表反转显示的四种方法

    第一种,使用reversed 函数,reversed返回的结果是一个反转的迭代器,我们需要对其进行 list 转换 listNode = [1,2,3,4,5] newList = list(reversed(listNode)) print(newList) #结果 [5,4,3,2,1] 第二种,使用sorted函数,sorted是排序函数,它是对一个列表进行排序后生成一个新的list列表,而sort则是在原来的列表上直接进行排序. listNode = [1,2,3,4,5] newLis

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

  • python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结

    在处理图像的时候经常是读取图片以后把图片转换为灰度图.作为一个刚入坑的小白,我在这篇博客记录了四种处理的方法. 首先导入包: import numpy as np import cv2 import tensorflow as tf from PIL import Image 方法一:在使用OpenCV读取图片的同时将图片转换为灰度图: img = cv2.imread(imgfile, cv2.IMREAD_GRAYSCALE) print("cv2.imread(imgfile, cv2.I

  • linux查看目录的四种方法(ls只显示目录)

    1.ls -d * 复制代码 代码如下: amosli@amosli-pc:~$ ls -d *%APPDATA%     develop           many                    sorted.txt  workspacebank          Documents         Music                   space       下载 2. find . -type d -maxdepth 1 如果不加-maxdepth 参数的话那么将会有无

随机推荐