手把手教你用Python给小姐姐美个颜
云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
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所示。
程序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()
注意: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个颜色通道混合一下,在代码中加入一行代码:img3 = cv2.merge([b,g,r]);,这样img3又回到了原来输入的彩色图像样式,显示效果如图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所示的输出结果。
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所示。
在读取不同通道的图像像素值时,需要先确定图像的通道排列是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] = 0
gray[i, j][2] = 0
cv2.imshow('gray.jpg', gray)
cv2.waitKey(0)
=if __name__ == '__main__':
main()
上述程序新建了一个3通道的空的彩色图像,然后将读取的灰度图像放在新建的彩色图像的第一个通道,也就是B通道,其他两个通道赋值0,所以图像整体呈现蓝色,程序运行结果如图3.14所示。
上述方法转换的图像颜色很单一。有没有更加智能的方法呢?在摄像技术不是很成熟的时期,人们给拍摄出来的黑白照片上色,发明了一种伪彩色图像技术。在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所示。伪彩色图像目前主要应用在对高度、压力、密度、湿度等描述上,彩色数据可视化。
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-05-25
本文作者: 方圆圆
本文来自:“大数据DT 微信公众号”,了解相关信息可以关注“大数据DT”

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
码农幸福指数:哪种编程语言最让人感到幸福?
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 刻板印象无处不在,在IT世界中也是如此。“ PHP是最糟糕的语言”或“ Python适合初学者”,这样的固有认知已然扎根在很多人的印象里。 编程营2020即将开赛,我们将通过github和来自开发人员的调查数据找到真相,快来看看是哪个编程语言最终“C位出道”吧! 数据采集 Github对于任何开发人员来说都不会陌生。它不仅可以用作版本控制工具,还可以收集存储库和项目统计信息、用户形象数据和评论。我们就可以访问有关年龄,性别和个人资料照片的信息,用到的工具是Microsoft Face API。 Github提供了25个最受欢迎的存储库列表,并显示了前5名贡献者。我将使用Eigencoder应用程序从每个存储库中检测30-80张个人资料照片并对其进行分析。 性别 FaceAPI具有从面部结构中检测性别的功能。也许不够全面,但也不难看出,AI和Webdev语言其实是有不少女性使用者的。 年龄 年龄指标的结果很有趣,较老的编程语言似乎本应由年长的程序员使用,但Java却拥有着最年轻的开发人员群...
-
下一篇
vs code使用技巧- win 10 vs code 搭建C语言编译运行环境
vs code使用技巧 win 10 vs code 搭建C语言编译运行环境 1. 官方的方法 官方教程链接Using GCC with MinGW 这里对方法的简单总结如下: 安装MinGW,并配置环境变量(百度就有) 安装vs code(同样是百度就有) 安装汉化插件(为了方便咱们交流,毕竟我英语不好) 如上图,点击圈起来的图标,这其实就是插件商店入口,当然也有快捷键,这可以自行百度 搜索chinese, 安装上图所指的Chinese(Simplified)插件 重启vs code生效 安装C/C++插件 和安装汉化插件差不多 看上图步骤1, 2, 3 新建(也可以不新建)一个文件夹, 然后文件 -> 打开文件夹, 打开刚才新建的文件夹 新建一个.c结尾的文件 如上图,先点1处 再点击2处 3处有几个图标, 把鼠标放上去就有提示 按照提示完成文件的创建, 比如我的是hello.c 打开hello.c 终端 -> 配置默认生成任务 -> 选择下面这个shell开头的就可以了 这一步之后,文件夹里面多了一个.vscode文件夹,里面多了一个tasks.json文件...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2全家桶,快速入门学习开发网站教程
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL数据库在高并发下的优化方案
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果