一、imread()的grayscale和cvtColor()的区别

在图像加载API中,我们可以看到imread()有一个参数flags ,这个参数有一个选项是cv.IMREAD_GRAYSCALE,意思是将原图像转换为灰度图后返回。

官方文档解释是:

If set, always convert image to the single channel grayscale image (codec internal conversion).

如果设置,总是将图像转换成单通道的灰度图(采取内部转换编码)。

并且在imread()的API文档中也有一个注释

When using IMREAD_GRAYSCALE, the codec's internal grayscale conversion will be used, if available. Results may differ to the output of cvtColor().

当用参数IMREAD_GRAYSCALE时,如果内部灰度转换编码可获得,那么它将被使用。结果与cvtColor()的有差异。cvtColor()

可以看出来,在读取图像时直接转换成灰度图和先读取全色再用cvtColor()转成灰度,结果是不一样的。

这个区别虽然存在,但是非常小,仅有部分区域、一些像素点不同;具体可以参考Stack Overflow的文章,测试代码如下

import cv2
import numpy as nppath = 'some/path/to/color/image.jpg'# Load color image (BGR) and convert to gray
img = cv2.imread(path)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Load in grayscale mode
img_gray_mode = cv2.imread(path, 0)# diff = img_gray_mode - img_gray
diff = cv2.bitwise_xor(img_gray,img_gray_mode)
print(np.sum(diff ))
# 输出结果不为0,对于一个494 x 750=370500的图像,结果为6143,不是很大cv2.imshow('diff', diff)
# 最后会发现图像不全是黑色,说明img_gray和img_gray_mode有像素点不一样cv2.waitKey()

二、对cvtColor()的讲解

cvtColor()不仅可以将三通道转成灰度单通道,也可将BGR的三通道转成其他类型的三通道,比如HSV。

以下摘录于官网cvtColor()文档。

  cv::COLOR_BGR2BGRA = 0,cv::COLOR_RGB2RGBA = COLOR_BGR2BGRA,cv::COLOR_BGRA2BGR = 1,cv::COLOR_RGBA2RGB = COLOR_BGRA2BGR,cv::COLOR_BGR2RGBA = 2,cv::COLOR_RGB2BGRA = COLOR_BGR2RGBA,cv::COLOR_RGBA2BGR = 3,cv::COLOR_BGRA2RGB = COLOR_RGBA2BGR,cv::COLOR_BGR2RGB = 4,cv::COLOR_RGB2BGR = COLOR_BGR2RGB,cv::COLOR_BGRA2RGBA = 5,cv::COLOR_RGBA2BGRA = COLOR_BGRA2RGBA,cv::COLOR_BGR2GRAY = 6,cv::COLOR_RGB2GRAY = 7,cv::COLOR_GRAY2BGR = 8,cv::COLOR_GRAY2RGB = COLOR_GRAY2BGR,cv::COLOR_GRAY2BGRA = 9,cv::COLOR_GRAY2RGBA = COLOR_GRAY2BGRA,cv::COLOR_BGRA2GRAY = 10,cv::COLOR_RGBA2GRAY = 11,cv::COLOR_BGR2BGR565 = 12,cv::COLOR_RGB2BGR565 = 13,cv::COLOR_BGR5652BGR = 14,cv::COLOR_BGR5652RGB = 15,cv::COLOR_BGRA2BGR565 = 16,cv::COLOR_RGBA2BGR565 = 17,cv::COLOR_BGR5652BGRA = 18,cv::COLOR_BGR5652RGBA = 19,cv::COLOR_GRAY2BGR565 = 20,cv::COLOR_BGR5652GRAY = 21,cv::COLOR_BGR2BGR555 = 22,cv::COLOR_RGB2BGR555 = 23,cv::COLOR_BGR5552BGR = 24,cv::COLOR_BGR5552RGB = 25,cv::COLOR_BGRA2BGR555 = 26,cv::COLOR_RGBA2BGR555 = 27,cv::COLOR_BGR5552BGRA = 28,cv::COLOR_BGR5552RGBA = 29,cv::COLOR_GRAY2BGR555 = 30,cv::COLOR_BGR5552GRAY = 31,cv::COLOR_BGR2XYZ = 32,cv::COLOR_RGB2XYZ = 33,cv::COLOR_XYZ2BGR = 34,cv::COLOR_XYZ2RGB = 35,cv::COLOR_BGR2YCrCb = 36,cv::COLOR_RGB2YCrCb = 37,cv::COLOR_YCrCb2BGR = 38,cv::COLOR_YCrCb2RGB = 39,cv::COLOR_BGR2HSV = 40,cv::COLOR_RGB2HSV = 41,cv::COLOR_BGR2Lab = 44,cv::COLOR_RGB2Lab = 45,cv::COLOR_BGR2Luv = 50,

最常见的是COLOR_BGR2GRAY=6、COLOR_GRAY2BGR=8、COLOR_BGR2HLS=52、COLOR_RGB2HLS=53、COLOR_BGR2HSV=40、COLOR_RGB2HSV=41

语法很简单,就是cv2.cvtColor(src, code[, dst[, dstCn]])。

参数src用来指定图片路径。

参数code就是用来指定颜色空间转换规则。

三、通道的分离与转换(split、merge)

本章节讨论cv中的split,而不是numpy中的。

cv中的split是分离图像通道,而numpy中的split是分割数组。

假设img是一个BGR颜色图,使用split()分离通道后,由b, g, r接收。

import cv2 as cvimg = cv.imread('Snipaste_5.png')print(img.shape)
b, g, r = cv.split(img)
print(b.shape)
print(g.shape)
print(r.shape)
cv.imshow("b", b)
cv.imshow("g", g)
cv.imshow("r", r)
cv.waitKey(0)
cv.destroyAllWindows()

输出如下

(769, 188, 3)
(769, 188)
(769, 188)
(769, 188)
(769, 188)

原图如下

输出的三个通道图片,是灰度图;这是因为b、g、r这三个图片变量的维度只有2维,而imshow()只所以能够顺利执行,就是因为会给三个图片变量额外扩充一维,第三维的大小为1,这时候各个通道的对应蓝、绿、红的数值自然就被视作灰度值了(或者看成第三维大小为3,拷贝性填充3个同样的值,同样也是灰度图)。

比如假如通道b的某点取值为255,那么单独imshow()这个通道,这一点和(255, 255, 255)的显示相同,得以验证上面的结论。

分离之后,我们可以对各个通道进行单独操作(加减乘除等),单独操作完成了就可以合并成一个完整的三色图。

比如下面的代码,进一步对各个通道同时加上100(饱和运算),可以提高整体的亮度水平(虽然可能用不到),然后再用merge()融合在一起。

import cv2 as cvimg = cv.imread('Snipaste_5.png')
print(img)
print(img.shape)
b, g, r = cv.split(img)
b = cv.add(b, 100)
g = cv.add(g, 100)
r = cv.add(r, 100)
cv.merge([b, g, r], img)
print(b.shape)
print(g.shape)
print(r.shape)
cv.imshow("b", b)
cv.imshow("g", g)
cv.imshow("r", r)
cv.imshow("img", img)
cv.waitKey(0)
cv.destroyAllWindows()

四、numpy式通道分离和合并

如果您学过Numpy的数组切片、索引方面的知识,应该能够很简单地看出下面这两条语句等价,都是用来进行通道的分离。

b, g, r = img[:, :, 0], img[:, :, 1], img[:, :, 2]

b, g, r = cv2.split(img)

同理,下面两条都是用来进行通道的合并。

img[:, :, 0], img[:, :, 1], img[:, :, 2] = b, g, r

cv2.merge([b, g, r], img)

因此,我们执行下面的代码

import cv2 as cvimg = cv.imread('Snipaste_5.png')
copy = img.copy()b, g, r = cv.split(img)
b1, g1, r1 = copy[:, :, 0], copy[:, :, 1], copy[:, :, 2]
print((b == b1).all())
print((g == g1).all())
print((r == r1).all())
b = cv.add(b, 100)
g = cv.add(g, 100)
r = cv.add(r, 100)
b1 = cv.add(b1, 100)
g1 = cv.add(g1, 100)
r1 = cv.add(r1, 100)
cv.merge([b, g, r], img)
copy[:, :, 0], copy[:, :, 1], copy[:, :, 2] = b1, g1, r1
cv.imshow("img", img)
cv.imshow("copy", copy)
cv.waitKey(0)
cv.destroyAllWindows()

最后输出的两张图片,完全一模一样!

【OpenCV-Python-课程学习(贾)】OpenCV3.3课程学习笔记:图像色彩空间转换(cvtColor),imread()的grayscale和cvtColor()的区别、通道分离与转换相关推荐

  1. 【OpenCV + Python】之bitwise_and、bitwise_not,bitwise_xor等图像基本运算(opencv位操作)

    1.灰度图由0~255表示,0为黑,255为白,从位操作的角度出发,纯黑色为0,不是纯黑色为1,所以在一些纯白色,或者纯黑色背景里,可以转为灰度图,利用阈值将非背景色的内容抠出来作为模板,再与原图做位 ...

  2. 【学习OpenCV4】案例3:OpenCV Python语言开发环境搭建

    本书分享内容来自图书学习OpenCV 4:基于Python的算法实战>,该书刚刚上市,是国内第一本系统讲解OpenCV4各个模块的图书,配套案例深入浅出的讲解.第一章有在各个平台搭建环境的介绍, ...

  3. 【OpenCV-Python-课程学习(贾)】 OpenCV3.3课程学习笔记-开篇和简介

    一.课程简介 该课程围绕OpenCV3.3进行讲解,不仅包括图像加载和保存.色彩空间转换.ROI与泛洪填充.模糊和滤波平滑操作.图像二值化.图像金字塔.图像直方图.图像梯度.模板匹配等内容,贾志刚老师 ...

  4. python课程设计总结1000-编程小白学习python总结文章(一)

    写在开头UP猪自己本人是工科学生,如今大四,在oppo实习中,然后最近发现以及结合自己在工作中了解到的,得到了一个消息"玩硬件的永远没有玩软件编程的有钱途",再加上发现现在有些招聘 ...

  5. 神经网络隐藏层个数怎么确定_含有一个隐藏层的神经网络对平面数据分类python实现(吴恩达深度学习课程1第3周作业)...

    含有一个隐藏层的神经网络对平面数据分类python实现(吴恩达深度学习课程1第3周作业): ''' 题目: 建立只有一个隐藏层的神经网络, 对于给定的一个类似于花朵的图案数据, 里面有红色(y=0)和 ...

  6. 金融python入门书籍_零基础想系统地学习金融学、量化投资、数据分析、python,需要哪些课程、书籍?有哪些证书可以考?...

    7.10更新,最近写了关于量化交易的一些文章: -------------------------分割------------------------- 感谢大家的支持!我要把下文当中视频全部放出来给 ...

  7. python人工智能课程实例_python人工智能AI深度学习/机器学习全套课程 视频教程+ppt+代码...

    这是一套Python/人工智能/AI/机器学习/深度学习 全套实战课程,包含视频教程以及文档.源码等,欢迎下载 01. python数据分析与机器学习实战 02.深度学习入门视频课程(上篇) 03.深 ...

  8. cs python课程 加州大学_【北美名校CS课程整理系列】6. 强化学习与决策控制

    简介 今天我们带来本系列第六篇文章:北美CS名校强化学习与决策控制相关课程的整理.本系列今后将持续保持一周两更的频率,想学习更多请点击关注专栏大学模拟器,点赞支持,也欢迎关注微信公众号Univ模拟器. ...

  9. 学python后做什么工作好_学习完Python课程后可以做什么工作?

    Python作为人工智能.大数据的首选编程语言,也是进入编程世界的理想选择,已经成为了大家都在追求学习的语言,那么学习Python之后到底可以做什么呢?为您详细的介绍一下. 什么是Python?Pyt ...

  10. python贪吃蛇代码课程设计_c语言课程设计之贪吃蛇代码及思路 c语言课程设计报告之贪吃蛇...

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8846529.html 注:本文档需与c语言课程设计之贪吃蛇文档配套使用.c语言实现贪吃蛇代码可 ...

最新文章

  1. 注入(一):APC注入
  2. ABAP动态取得数据的方法
  3. Markdown:数学公式(4)
  4. 浅谈 SSD,eMMC,UFS
  5. java输入一行_用java编写从标准输入读入一行字符串,打印出其中所有的数字
  6. linux(cat,more,less,head)——对文件显示进行查看操作
  7. 首次打开(更新版本)APP向导界面
  8. wireshark在win8.1上抓包的问题解决
  9. MySQL删除主从表数据
  10. Java项目——Everything 开发思路
  11. 三星手机和计算机如何连接打印机,WIFI当道 手把手教你如何实现无线打印
  12. 查看oracle归档日志内容,查看归档日志内容
  13. java实现奖学金申请,基于ssm+mysql的web助学金申请系统[实现过程记录]
  14. WiFi测试规范总结
  15. 蓝精灵协会 (The Smurfs‘ Society) 宣布与著名艺术家展开一系列的合作,打造传奇 PFP 系列
  16. 人工智能实践作业-修道士和野人过河问题
  17. python编程入门视频教程-PYTHON编程从0到1(视频教学版)
  18. php上传图片按钮不灵,ctrl键失灵怎么办
  19. c++ 继承的同名成员以及同名函数的处理方式
  20. vite+ts+elementplus运行正常打包报错

热门文章

  1. 01 学习如鹏网的C语言免费课程
  2. 幸运抽奖java_java10幸运抽奖
  3. sklearn 1.0.1官方文档教程
  4. OpenCV实现监控移动侦测
  5. 苹果iPad守江山,安卓平板搅江湖】
  6. 对Python的深度学习库Theano的介绍
  7. 网络安全——lcx的使用
  8. Configuring CODESYS
  9. 中医药天池大数据竞赛——中医文献问题生成挑战(二)
  10. freeswitch通话记录mysql_freeswitch电话计费详单入库方法