导读:本文将着重介绍彩色图像的处理及彩色图像和灰度图像相互转换的相关内容。

作者:方圆圆

来源:华章科技

01 图像的颜色空间

彩色图像比灰度图像拥有更丰富的信息,它的每个像素通常是由红(R)、绿(G)、蓝(B)3个分量来表示的,每个分量介于0~255之间。

图像中呈现的不同的颜色都是由R、G、B这3种颜色混合而成的。在OpenCV里面,彩色图像拥有3个颜色通道,但是通道的顺序是可以变换的,RGB、BRG、BGR、GBR、GRB都有可能。

在读取一幅图像的时候,我们对于图像的颜色通道排布并不清楚,因此需要先把图像的颜色通道固定下来,这就需要调用OpenCV的cvtColor()函数。

cvtColor()函数的功能是对图像进行颜色空间变换,原型如下:

dst=cv2.cvtColor(src, code )

参数说明:

  • src:输入图像即要进行颜色空间变换的原图像,可以是Mat类。
  • code:转换的代码或标识,即在此确定将什么制式的图片转换成什么制式的图片,后面会详细讲述。

函数输出进行颜色空间变换后存储图像。

通过调用cvtColor()函数,还可以将一幅彩色图像转换成灰度图像,示例代码见程序3-5,代码运行效果如图3.9所示。

▲彩色图像1.jpg

  • 程序3-5 彩色图像转灰度图像示例:color2gray.py
# -*- coding: UTF-8 -*-import numpy as npimport cv2#定义main()函数def main():   img = cv2.imread('1.jpg')   img2 = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)                                          #从彩色图像转化成灰度图像   cv2.imshow('img2.bmp ', img2)   cv2.waitKey(0)if __name__ == '__main__':   main()

▲图3.9 color2gray.py程序运行结果

注意:cvtColor()函数还可以通过改变参数cv2.COLOR_RGB2BRG等改变图像颜色通道的排列顺序。另外也可以直接在读取图像函数imread时设置参数为0,直接将彩色图像读取为灰度图像,img = cv2.imread('1.jpg',0)。

02 彩色图像的通道分离和混合

灰度图像是单通道的,彩色图像拥有R、G、B三个颜色通道。因此在图像处理时,经常把颜色通道分离,单独处理一个通道的数组,然后再合并成一幅彩色图像。

在实际的代码编写中,只需要调用OpenCV中的split()和merge()函数就可以实现图像的通道分离和合并。

split()函数的功能是将多通道的矩阵分离成单通道矩阵,原型如下:

[,mv]=cv2.split (src)

参数说明:输入参数为要进行分离的图像矩阵,输出参数为一个Mat数组。

merge()函数的功能是将多个单通道图像合成一幅多通道图像,原型如下:

dst=cv2.merge([,dst] )

参数说明:输入参数可以是Mat数组,输出为合并后的图像矩阵。

03 彩色图像的通道分离和混合程序示例

输入一幅彩色图像,通过程序3-6将其分割成R、G、B这3个通道的图像并显示。在分割前需要先确定图像的颜色通道分布,因此先调用cvtColor()函数固定颜色通道。示例代码参见程序3-6,效果如图3.10所示。

  • 程序3-6 彩色图像通道分离示例:colorsplit.py
# -*- coding: UTF-8 -*-import numpy as npimport cv2#定义main()函数def main():   img = cv2.imread('1.jpg')       img2 = cv2.cvtColor(img,cv2.COLOR_BRG2RGB)   r,g,b = cv2.split(img2)   #img分离成三个单通道的图像   cv2.imshow("Red", r)   cv2.imshow("Green", g)   cv2.imshow("Blue", b)   cv2.waitKey(0)if __name__ == '__main__':   main()

▲图3.10 colorsplit.py程序运行结果

可以看出,在图像通道分离后,不同颜色通道的图像显示深浅不一,单通道的图像呈现该颜色通道的灰度信息。接下来把这3个颜色通道混合一下,在代码中加入一行代码:img3 = cv2.merge([b,g,r]);,这样img3又回到了原来输入的彩色图像样式,显示效果如图3.11所示。

▲图3.11 图像三通道混合后的输出

04 彩色图像的二值化

图像的二值化是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。彩色图像二值化最简单的步骤如下:

  1. 彩色图像转灰度。
  2. 图像阈值化处理,即像素值高于某阈值的像素赋值为255,反之为0。

其中,阈值的操作会调用OpenCV的threshold()函数。

threshold()函数声明如下:

ret, dst = cv2.threshold(src, thresh, maxval, type);

函数功能:实现图像固定阈值的二值化。

参数说明:

  • src:输入图,只能输入单通道图像,通常来说为灰度图。
  • dst:输出图。
  • thresh:阈值。
  • maxval:当像素值超过了阈值(或者小于阈值,根据type来决定)时所赋予的值。
  • type:二值化操作的类型,包含5种类型,即cv2.THRESH_BINARY、cv2.THRESH_BINARY_INV、cv2.THRESH_TRUNC、cv2.THRESH_TOZERO和cv2.THRESH_TOZERO_INV。

举例参考程序3-7。

  • 程序3-7 彩色图像二值化示例:colorthreshold.py
# -*- coding: UTF-8 -*-import numpy as npimport cv2#定义main()函数def main():   img = cv2.imread('1.jpg',0)   thresh1,dst =cv2.threshold(img,127,255,cv2.THRESH_BINARY)                                               #图像二值化   cv2.imshow("dst", dst)   cv2.waitKey(0)if __name__ == '__main__':   main()

如程序3-7所示,高于127的像素全部置为255,低于的全部置为0,得到如图3.12所示的输出结果。

▲图3.12 colorthreshold.py程序输出结果

05 彩色图像的遍历

灰度图像的遍历按照访问二维数组的方式得到坐标位置的像素。那对于彩色图像呢?彩色图像可以看出是3维数组,遍历方式参见程序3-8。

  • 程序3-8 遍历彩色图像示例:color1.py
# -*- coding: UTF-8 -*-import numpy as npimport cv2#定义main()函数def main():   img = cv2.imread('1.jpg')       height,width,n = img.shape #得到图片的宽高和维度   img2 = img.copy()  #复制一个跟img相同的新图片   #宽高两个维度遍历图片   for i in range(height):      for j in range(width):         img2[i, j][0] = 0 #将第一个通道内的元素重新赋值   cv2.imshow('img2.jpg', img2)   cv2.waitKey(0)if __name__ == '__main__':   main()

由于第一个通道里面的颜色信息全部变为了0,图像显示结果如图3.13所示。

▲图3.13 color1.py程序运行结果

在读取不同通道的图像像素值时,需要先确定图像的通道排列是RGB还是BRG。

06 彩色图像和灰度图像的转换

经过前面的学习,我们知道彩色图像转成灰度图像有3种路径:

  • imread读取图像的时候直接设置参数为0,彩色图像自动被读成灰度图像。
  • 调用cvtColor()函数,参数设置为cv2.COLOR_BGR2GRAY。
  • 调用split()函数,可以将一幅彩色图像分离成3个单通道的灰度图像。

那么灰度图像有没有可能转换成彩色图像呢?

我们知道灰度图像是单通道的,彩色图像是RGB 3这个颜色通道。那么是否可以人为地增加图像的通道,伪造出另外两个通道,而另外两个通道可以随机地赋值呢?程序3-9做出了尝试。

  • 程序3-9 增加图像通道示例:gray2color1.py
# -*- coding: UTF-8 -*-import numpy as npimport cv2#定义main()函数def main():   img = cv2.imread('gray1.jpg')       gray = np.zeros((512, 512, 3), np.uint8)  # 生成一个空彩色图像   height,width,n = img.shape   #图像像素级遍历   for i in range(height):      for j in range(width):         gray[i, j][0] = img[i, j][0]         gray[i, j][1] = 0         gray[i, j][2] = 0   cv2.imshow('gray.jpg', gray)   cv2.waitKey(0)=if __name__ == '__main__':   main()

上述程序新建了一个3通道的空的彩色图像,然后将读取的灰度图像放在新建的彩色图像的第一个通道,也就是B通道,其他两个通道赋值0,所以图像整体呈现蓝色,程序运行结果如图3.14所示。

▲图3.14 gray2color1.py程序运行结果

上述方法转换的图像颜色很单一。有没有更加智能的方法呢?在摄像技术不是很成熟的时期,人们给拍摄出来的黑白照片上色,发明了一种伪彩色图像技术。在OpenCV里面,可以用预定义好的Colormap(色度图)来给图片上色,示例代码参见程序3-10。

  • 程序3-10 伪彩色图像技术示例:gray2color2.py
# -*- coding: UTF-8 -*-import numpy as npimport cv2#定义main()函数def main():   img = cv2.imread('gray1.jpg')       im_color = cv2.applyColorMap(img, cv2.COLORMAP_JET)  #色度图上色   cv2.imshow("im_color.jpg", im_color)   cv2.waitKey(0)if __name__ == '__main__':   main()

程序运行结果如图3.15所示。伪彩色图像目前主要应用在对高度、压力、密度、湿度等描述上,彩色数据可视化。

▲图3.15 gray2color程序运行结果

关于作者:方圆圆,在人工智能技术领域有多年的工作经历和丰富的开发经验。

本文摘编自《人脸识别与美颜算法实战:基于 Python、机器学习与深度学习》,经出版方授权发布。

延伸阅读《人脸识别与美颜算法实战》

推荐语:资深AI算法工程师结合60多个人脸图像案例介绍基于Python、机器学习及深度学习在人脸识别和美颜算法中的应用。

java opencv bytearray转mat_如何用Python+OpenCV处理图像色彩?终于有人讲明白了相关推荐

  1. 什么是折线图?怎样用Python绘制?怎么用?终于有人讲明白了(附代码)

    来源:大数据DT 本文约5400字,建议阅读10分钟 本文为你介绍数据分析时经常用到的折线图,可以用来呈现哪些数据关系?在数据分析过程中可以解决哪些问题?怎样用Python绘制折线图? 01 概述 折 ...

  2. 什么是气泡图?怎样用Python绘制?怎么用?终于有人讲明白了

    导读:什么是气泡图?可以用来呈现哪些数据关系?在数据分析过程中可以解决哪些问题?怎样用Python绘制气泡图?本文逐一为你解答. 作者:屈希峰 来源:大数据DT(ID:bigdatadt) 01 概述 ...

  3. 什么是气泡图?怎样用Python绘制?有什么用?终于有人讲明白了

    导读:什么是气泡图?可以用来呈现哪些数据关系?在数据分析过程中可以解决哪些问题?怎样用Python绘制气泡图?本文逐一为你解答. 作者:屈希峰 来源:大数据DT(ID:bigdatadt) 01 概述 ...

  4. 简单的python画图代码_python opencv如何实现简易画图板 python opencv实现简易画图板代码...

    python opencv如何实现简易画图板?本篇文章小编给大家分享一下python opencv实现简易画图板代码,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 代码如下 ...

  5. c++ opencv 识别车牌_小强学Python+OpenCV之-1.0开篇

    写在前面: 有没有想过使用Python + OpenCV来实现人脸识别? 想想就有点小兴奋吧. 小强也是不久前才了解到可以使用Python + OpenCV进行图像处理.觉得有趣就想学习一下. 在这里 ...

  6. 如何用python+openCV打开电脑的摄像头?

    1)安装OpenCV: pip install opencv 2)打开摄像头,获取视频流,显示在窗口上 import cv2 as cv# 0是代表摄像头编号,只有一个的话默认为0 capture = ...

  7. python写透视挂_如何用Python openCV 用透视变换的方法对图像进行矫正

    .需要矫正的图片1 需要矫正的图 矫正后的结果: 矫正后的图 需要矫正的图片2 矫正前 矫正后 # import the necessary packages from imutils.perspec ...

  8. python opencv屏幕找图_使用Python+OpenCV进行图像模板匹配(Match Template)实例-找到百度首页按钮并点击...

    意图:准备一张小图,在电脑屏幕上找到小图坐标,并点击. 1  安装 opencv 和 numpy: pip3 install opencv-python 上述命令将 opencv 和 numpy都安装 ...

  9. python朋友圈为什么这么火-火爆朋友圈的Python入门教程,终于有人把它整理成手册了...

    image.png 文末附赠PDF!!! 本书是一本Python入门书籍,适合对计算机了解不多,没有学过编程,但对编程感兴趣的读者学习使用.这本书以习题的方式引导读者一步一步学习编程,从简单的打印一直 ...

最新文章

  1. 如何将零终止的字节数组转换为字符串?
  2. oracle行转列与列转行
  3. webstorm设置
  4. java点到曲线的距离公式,使用Haversine的距离公式获取经度和纬度的距离
  5. 一篇文章学懂Shell脚本,最简明的教程在这里
  6. Odoo免费开源企业信息化平台助力企业成功
  7. Linux查看网络连接数,统计网络连接数(netstat、Apache连接数)
  8. python函数定义语句可执行_python学习笔记-定义函数
  9. tf.train.Example的用法(转)
  10. 数学归纳法证明求和公式
  11. matlab如何实现波的叠加原理,什么是波的叠加原理?-王尚
  12. 谁偷了我的1天,JSON格式化时区问题
  13. 百度地图 和百度导航及语音集成冲突解决办法
  14. Android 8.0 Activity启动流程分析
  15. 今日头条搜索排名seo怎么做?今天头条网站优化规则揭秘!
  16. 英语小学口语测试软件,你们的小学英语口语测试怎么搞?
  17. 感时花溅泪,恨别鸟惊心
  18. 为什么CSDN文章总是待审核?
  19. unity改变物体大小的两种方式
  20. 创业思维 - LeanCloud的故事

热门文章

  1. 12星座的出生年月日性格_12星座男人最爱的女人性格
  2. mybatis mysql 事务处理_详解Java的MyBatis框架中的事务处理
  3. 使用左 右 全 内连接及使用where条件语句的区别
  4. 代理服务器列表(20100116)
  5. 【BZOJ2337】XOR和路径,概率期望DP+高斯消元
  6. java兔子问题编程思路详解_Java算法之“兔子问题”
  7. 2017.9.10 土地购买 思考记录
  8. 经典最短路算法的原理启示
  9. mysql恢复数据库 慢_Mysqldump导入数据库很慢的解决办法
  10. 【英语学习】【Daily English】U02 Daily Routine L01 Sadly, my schedule is very tight.