OpenCV-Python 彩色图像转灰度图

本文主要是讲OpenCV-Python对图像进行彩色转灰度图的操作


前言

这里给出一个OpenCV-Python文档的链接
链接: OpenCV-Python中文文档.


一、读取图片

使用函数cv2.imread()读取图像。该映像应位于工作目录中,或者应提供完整的映像路径。

第二个参数是一个标志,用于指定应读取图像的方式。

cv2.IMREAD_COLOR:加载彩色图像。图像的任何透明度都将被忽略。这是默认标志。
cv2.IMREAD_GRAYSCALE:以灰度模式加载图像
cv2.IMREAD_UNCHANGED:加载图像,包括alpha通道

这里有个小细节
除了这三个标志,您可以分别简单地分别传递整数1、0或-1。
在这里插入图片描述

import cv2 as cv
img = cv.imread('lbxx.jpg',0)  #直接以灰度图片读取
img_1 = cv.imread('lbxx.jpg',cv.IMREAD_GRAYSCALE)  

看看效果图
在这里插入图片描述
很明显,这里两个读取方法是一样的。


二、彩色图片转灰度图

这里用了三种方法
第一种:
就是直接读取灰度图片:

import cv2 as cv
img = cv.imread('lbxx.jpg',0)  #直接以灰度图片读取
img_1 = cv.imread('lbxx.jpg',cv.IMREAD_GRAYSCALE)  

这种方法的图片就在上边

第二种:
通过cvtColor库将其转为灰度

import cv2 as cv
img = cv.imread('lbxx.jpg',1)
img_1 = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.imshow('gray',img_1)
cv.imshow('colour',img)
cv.waitKey(0)

在这里插入图片描述
第三种:
通过分离RGB三个通道得到三个通道的灰度图

import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('lbxx.jpg',1)
#cv2.imread读取图片格式是BGR
b,g,r = cv.split(img)  #这个地方将图像拆分,把彩色图像分为3个颜色
plt.figure(figsize=(10,8))
color = [b,g,r]
img_2 = cv.merge([r,g,b])  #这个地方我把bgr格式的图片转成了rgb,然后显示的时候会变成正常的彩色
for i in range(3):
    plt.subplot(2,2,i+1)
    plt.imshow(color[i],'gray')
    plt.subplot(2,2,4)
    plt.imshow(img_2)
plt.savefig('./三通道灰度.png')
plt.show()

在这里插入图片描述
这里很明显可以看出每个图的颜色是不一样的
从左到右从上到下分别是b,g,r,原图


强烈说明:

OpenCV-python 在读取图片的时候
imread读取的图片是BGR不是RGB!!!不是RGB!!!不是RGB!!!

这里我放一张BGR的图
在这里插入图片描述他是这个鬼样子的
在这里插入图片描述


在放一张RGB
在这里插入图片描述

是的是的这才是我认识的蜡笔小新

在这里插入图片描述
收工!
下班!

(一)问题的提出 接到一个问题问我,用OpenCV将彩色视频换为灰度视频并存储到本地磁盘的实践失败,之所以无法存储提问人怀疑是视频编码的问题。 (二)问题的分析 1.OpenCV作为一个非常好的辅助编程的东西,应该是经受得住考验的,怀疑是视频编码出问题不靠谱 2.直觉反应是在写入视频的时候,写入的帧图像存储格式和写入器定义的帧图像格式不符,导致内存报错 3.接收源代码发现有一段代码是这么写的: CvVideoWriter *writer = cvCreateVideoWriter( "myvideo.avi", CV_FOURCC('X', 'V', 'I', 'D'), fps, size); 一下子问题症结就找到了。 要化为灰度,那这段代码里对函数cvCreateVideoWriter()的掌握程度就要体现了,函数cvCreateVideoWriter()有5个输入参数,第5个输入参数is_color=1是在类cvCreateVideoWriter的构造函数中默认好的,这段代码没有定义is_color,说明同意is_color=1,那么writer写入器写到磁盘上的视频即为彩色视频,写入的帧图像是三通道的彩色图像,而后面的代码cvWriteFrame( writer, gray_frame );中,cvCvtColor( bgr_frame,gray_frame, CV_BGR2GRAY )把彩色的bgr_frame帧图像化为灰度的图像并存储到gray_frame图像实例中,于是这个gray_frame就与写入器要求的彩色三通道帧图像不一致,即分析2中的直觉:写入的帧图像存储格式和写入器定义的帧图像格式不符,导致内存报错 (三)问题的解决: 1.把代码进行更改,改成: //创建新的视频文件,需要输入视频文件完整路径名,格式,帧率,长宽值,默认是否为彩色值 CvVideoWriter* writer = cvCreateVideoWriter( "6.avi", //存储完整路径 CV_FOURCC('M','J','P','G'), //编码格式 fps,//帧率 size,//长宽值 0//是否为彩色,0为否,默认1为彩色 ); 2.注意到为什么把编码格式写成'M','J','P','G'?因为这个是无压缩的,直接windows操作系统的media player就可以播放了,如果是'X', 'V', 'I', 'D'格式,那多啰嗦,还要下载有编码解码的播放器才能播放,很累。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值