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

作者:方圆圆

来源:大数据DT(ID:hzdashuju)

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 np
import 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 np
import 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 np
import 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 np
import 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 np
import 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] = 0gray[i, j][2] = 0cv2.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 np
import 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程序运行结果

在大数据DT(ID:hzdashuju)后台对话框回复美颜,可获取本文源代码。

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

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

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

点击上图了解及购买

转载请联系微信:DoctorData

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

划重点????

干货直达????

  • 学Python半年,56岁的潘叔叔晒出99分成绩单,你呢?

  • 一个地方越有钱,人们就越不想结婚?

  • 为什么腾讯QQ的大数据平台选择了这款数据库?

  • 终于有人把数据科学、机器学习和人工智能讲明白了

更多精彩????

在公众号对话框输入以下关键词

查看更多优质内容!

PPT | 读书 | 书单 | 硬核 | 干货 

大数据 | 揭秘 | Python | 可视化

AI | 人工智能 | 5G | 中台

机器学习 | 深度学习 | 神经网络

合伙人 1024 | 大神 | 数学

据统计,99%的大咖都完成了这个神操作

????

手把手教你用Python给小姐姐美个颜相关推荐

  1. 手把手教你爬取清纯小姐姐私房照,小孩子写学

    手把手教你爬取清纯小姐姐私房照,小孩子写学 先上效果图 头文件: 因为爬虫需要用到请求网络部分,所以需要这两个包,没有的话自行下载即可.这个可以直接用pip安装.如果连pip都不懂,那就只能学习一下p ...

  2. 【python入门项目实战】:手把手教你给心仪的小姐姐制作漫画头像,懂中文就会

    前言 大家好! opencv是一个基于BSD许可发行(也就是俗称的开源)的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS上.由一系列 C 函数和少量 C++ 类 ...

  3. Python技巧-教你用Python告白小姐姐(附代码)

    作为一名Python程序员也要学会浪漫,网络上经常看到的表白代码你知道怎么做吗?下面小千就来告诉你,项目都有代码哦. 1.不同意不行 这是一个不同意就无法关闭的窗口,在你的真诚表白(苦苦哀求)之下,哪 ...

  4. 手把手教你爬取清纯小姐姐私房照,小孩子别学

    先上效果图 import re import requests import os 头文件: 因为爬虫需要用到请求网络部分,所以需要这两个包,没有的话自行下载即可.这个可以直接用pip安装.如果连pi ...

  5. python高手 百家号_别犹豫,美剧想看就看,手把手教你用Python轻松获取经典美剧地址...

    最早一部<越狱>转变了我对美剧的看法.主人公scofield的聪明才智和坚强的毅力,<绝命毒师>里面主人公的中年逆袭,<纸牌屋>里面老谋深算的政客,等等,这些美剧和 ...

  6. 手把手教你用Python改造一款外星人入侵小游戏

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 为学应须毕生力,攀高贵在少年时. ...

  7. python 靶心_手把手教你使用Python实战反欺诈模型|原理+代码

    原标题:手把手教你使用Python实战反欺诈模型|原理+代码 作者 | 萝卜 来源 | 早起Python(ID: zaoqi-python) 本文将基于不平衡数据,使用Python进行 反欺诈模型数据 ...

  8. python global用法_14_手把手教你学Python之函数(下)

    变量作用域:根据变量定义的位置,可将变量分为全局变量和局部变量. 全局变量:定义在函数外面的变量,可以在多个函数中进行访问,但不能执行赋值操作.如果有赋值语句,相当于创建了一个同名的局部变量: 局部变 ...

  9. python编程例子 输入 输出-推荐 :手把手教你用Python创建简单的神经网络(附代码)...

    原标题:推荐 :手把手教你用Python创建简单的神经网络(附代码) 作者:Michael J.Garbade:翻译:陈之炎:校对:丁楠雅 本文共2000字,9分钟. 本文将为你演示如何创建一个神经网 ...

最新文章

  1. 【Qt】qss样式表之:自定义属性实现动态切换样式
  2. 短 URL 服务的设计以及实现
  3. 实验三 密码破解技术
  4. MATLAB 图像处理函数(第六章)(获取图像矩形像素的运用)
  5. 问题 | 0x00007FF95287908C 处(位于 OpenCV.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception
  6. jQuery 基础事件
  7. 活动预告丨openGauss西安Meetup来啦!本周五见!
  8. k8s redis集群_容器:K8S核心组件介绍
  9. 人工智能及其体系结构_一些复制体系结构错误及其解决方案
  10. oracle将把varchar2字段(长度4000)改为clob类型
  11. 周鸿祎:做产品体验先把自己切换到二傻子模式
  12. excel计算机快捷键大全,Excel使用教程 Excel表格快捷键与功能键大全
  13. three.js 05-05 之 SphereGeometry 几何体
  14. 【强烈推荐】国土档案管理信息系统产品使用说明书系列目录V3.0【附下载地址】
  15. Latex表格制作记录
  16. sh: arithmetic expression: expecting primary
  17. 这个Excel函数,推荐所有人学习!HR都说必须会
  18. python将英文单词表示的数字转换成阿拉伯数字的代码
  19. 字符格式(gbk utf8等)
  20. 用算法撩妹都不会,别跟我说你是程序员

热门文章

  1. Qt文档阅读笔记-Rotations Example相关
  2. VS|Qt工作笔记-修改pro文件生成目录清晰的项目结构并添加三方库
  3. 二叉排序树的查找、插入
  4. 动易php,动易数据转成dedecms的php程序
  5. linux调用函数和case,Shell篇(3)-单双引号 ,函数及case语句用法
  6. vb.net datetimepicker月到当日的天数_【坦克世界】11月10日个人专属优惠商店限时开放...
  7. linux nfs mysql_MySQL实现高可用+共享存储NFS
  8. php中子类实现多接口,PHP子类无法实现相同的接口父类实现
  9. cmd怎么进入linux系统时间,Linux怎么更改命令提示符信息
  10. hooks组件封装 react_名符其实的react下一代状态管理器hox