python+OpenCV图像处理(二)图像像素的访问、通道的合并与分离

图像像素的访问、通道的合并与分离

(一)像素访问

在第一篇博客中,向大家介绍了,所谓的图像在计算机看来就是一个矩阵,对于RGB图像矩阵一共有三层,分别代表着RGB通道,矩阵中每一个数的大小代表着不同通道的亮度,范围在0~255之间。

访问图像的像素,就如同对矩阵元素的访问,很好理解。

print(img[0][0][0])

输出为:

34

也可以对所读取的图像矩阵的像素进行赋值

for i in range(400):for j in range(400):for k in range(3):img[i][j][k] = 255

显示图像为:


可以看到上图左上角形成了400x400像素的白色区域。

利用这个图像矩阵的特点,我们还可以做一些有趣的事情。比如说,椒盐现象。

我们需要先写一个椒盐函数,将我们想要的像素随机的分布在图像上。

def salt(img, numbers):for x in range(numbers):i = np.random.randint(img.shape[0])j = np.random.randint(img.shape[1])for k in range(3):img[i][j][k] = 255return img

嘿嘿,先来上1000个点!

img = salt(img, 1000)

图像显示为:


(二)通道分离

对于RGB图像,拥有RGB三原色通道,从矩阵的角度来讲,可以理解为三层矩阵,也就是三维的矩阵,每一层代表着一个通道。将图片进行通道分离可以使用OpenCV里的split函数,也可以通过numpy库对图像矩阵进行直接操作。图像展示的是不同通道的256级灰度图。

b, g, r = cv2.split(img)cv2.namedWindow('Blue')
cv2.imshow('Blue', b)
cv2.waitKey(0)cv2.namedWindow('Green')
cv2.imshow('Green', g)
cv2.waitKey(0)cv2.namedWindow('Red')
cv2.imshow('Red', r)
cv2.waitKey(0)



如果单独保留一个通道,并且令其它通道的图像矩阵的值全为零,将会变得更加好看,特意找了一个小的图片,避免篇幅过长。

img = cv2.imread('tongren.jpg')
b, g, r = cv2.split(img)pic = np.zeros(np.shape(img), np.uint8)
pic[:, :, 0] = b
cv2.namedWindow('Blue')
cv2.imshow('Blue', pic)
cv2.waitKey(0)pic = np.zeros(np.shape(img), np.uint8)
pic[:, :, 1] = g
cv2.namedWindow('Green')
cv2.imshow('Green', pic)
cv2.waitKey(0)pic = np.zeros(np.shape(img), np.uint8)
pic[:, :, 2] = r
cv2.namedWindow('Red')
cv2.imshow('Red', pic)
cv2.waitKey(0)cv2.destroyAllWindows()


也可以任选两个通道进行拼接。

pic = np.zeros(np.shape(img), np.uint8)
pic[:, :, 0] = b
pic[:, :, 1] = g
cv2.namedWindow('Blue-Green')
cv2.imshow('Blue-Green', pic)
cv2.waitKey(0)pic = np.zeros(np.shape(img), np.uint8)
pic[:, :, 0] = b
pic[:, :, 2] = r
cv2.namedWindow('Blue-Red')
cv2.imshow('Blue-Red', pic)
cv2.waitKey(0)pic = np.zeros(np.shape(img), np.uint8)
pic[:, :, 1] = g
pic[:, :, 2] = r
cv2.namedWindow('Green-Red')
cv2.imshow('Green-Red', pic)
cv2.waitKey(0)cv2.destroyAllWindows()


(三)通道合并

通道合并经常用的有两种方法

第一个是:OpenCV中自带的函数megre

megre = cv2.merge([b, g, r])

第二个是:numpy模块中的dstack,深度拼接函数

dstack = np.dstack([b, g, r])

但这两种拼接方式是不一样的,这一点一定要注意。pandas中也有对矩阵的拼接操作也可实现np.dstack()相同的效果,这里就不介绍了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

团队项目冲刺第三天

团队项目冲刺第三天个人工作总结如下: 1.昨天干了什么? 昨天熟悉了安卓应用开发的具体流程,着重看了用户界面设计部门的安卓开发知识,如某些控件的使用方法等等。 2.今天准备干什么或干了什么? 今天准备开发出了一个简…

PNG转EPS格式

由于使用LaTeX需要将png格式转为eps格式,如果电脑装了tex软件,则转换方式很简单: 首先打开需要转换的图片所在文件夹。在地址栏输入cmd: 此时会弹出,命令窗口,然后输入bmeps -c Figure1.png Figure1.eps 即…

工业根基,莫让ICT喧宾夺主

来源:英诺维盛公司新工业革命正在得到广泛的关注,而ICT则获得了更高的曝光率和话语权。ICT是信息、通信和技术三个英文词首字母组合(Information Communications Technology)。显然,ICT是新工业革命必不可少的“新工业…

github高级搜索

一、明确搜索仓库标题、仓库描述、README 1.只想查找仓库名称包含XX的仓库。语法: in:name 关键词 2.查找描述的内容 in:descripton 关键词 3.查README文件包含特定关键词 in:readme 关键词 二、明确搜索 star、fork 数大于多少的 1. star 数大于 1000 的XX 仓…

python+OpenCV图像处理(三)绘制简单的几何图形、显示文字

绘制简单的几何图形、显示文字 (一)绘制直线和矩形 img np.zeros([512, 512, 3]) # line函数用来画直线,第一个参数可以理解为画布矩阵, # 第二个参数pt1是直线的起始位置,第三个参数pt2是直线的终止位置,…

信息转换原理: 信息、知识、智能的一体化理论

来源:人机与认知实验室【数据、信息、知识、智能除了转换外,是否还有变异、弥聚等?能否把这些变化看成是态、势、感、知结构扭曲而产生的必然现象?】摘要 如何把信息转换为解决问题所需要的智能,是信息科学领域的核心研究课题. 本…

exit(0)和exit(1)区别

exit(0):正常退出程序; exit(1):非正常退出程序; return:返回。 return是语言级别的,表示调用堆栈的返回; exit是系统调用级别的,表示一个进程的退出。 转载于:https://www.cnblogs.…

MATLAB(一)Matlab“帮助”的使用

前言MATLAB是matrix和laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真…

github注册账号一直验证失败

github注册账号第二步是验证,选择图形验证需要将两幅图摆正,我在验证的时候第一幅图可以成功验证,但第二幅图一直失败,明明摆正了却一直说没有摆正,要不就说用时太长(真是有够恶心的)&#xff0…

javascript 学习笔记(一)

说明:从今天开始从基础抓起学习javascript-完全依据w3school(http://www.w3school.com.cn/js/js_intro.asp)网站顺序。这里我将我认为不好理解的地方积累下来,希望对像我一样的新手有益。 第一篇 JavaScript:写入 HTML 输出 1. javascript有…

[附下载]英特尔中国研究院携手生态伙伴发布《机器人4.0白皮书》

来源:硬蛋迈向云-边-端融合的机器人4.0时代在2019国际人工智能与机器人创新生态峰会上,英特尔中国研究院院长宋继强博士发表了题为《迈向云-边-端融合的机器人4.0时代》的主题演讲。宋院长分析了机器人行业的现状与发展趋势,提出了基于AI、5G…

使用哈希表的好处

先来了解一下Hash的基本思路: 设要存储对象的个数为num, 那么我们就用len个内存单元来存储它们(len>num); 以每个对象ki的关键字为自变量,用一个函数h(ki)来映射出ki的内存地址,也就是ki的下标,将ki对象的元素内容全部存入这个…

MATLAB(二)数据的输入

数据的输入 (一)简单矩阵的输入 1.要直接输入矩阵时,矩阵一行中的元素用空格或逗号分隔;矩阵行与行之间用分号“;”隔离,整个矩阵放在“[ ]”里。 >> a [1, 2, 3, 4;5, 6, 7, 8] a 1 2 3 …

linux yum下载RPM包后再安装LAMP环境

1.下载yum插件 yum-downloadonly,实现只下载软件包的功能。 yum install yum-downloadonly 或者 yum install yum-plugin-downloadonly 2.用yum下载Apache,Mysql,PHP. 2.1 下载Apache yum install httpd httpd-devel --downloadonly --downloaddir/home/lamp 2.2 下…

无人驾驶产业的国际比较和PEST分析

来源:智造智库【导读】国家新一代人工智能发展规划中明确提出,发展自动驾驶汽车和轨道交通系统,加强车载感知、自动驾驶、车联网、物联网等技术集成和配套,开发交通智能感知系统,形成我国自主的自动驾驶平台技术体系和…

树回归的介绍

线性回归包含一些强大的方法,但这些方法创建的模型需要拟合所有的样本点(局部加权线性回归除外)。当数据拥有众多特征并且特征之间关系十分复杂时,构建全局模型的想法就显得太难了,也略显笨拙。而且,实际生…

python glob.glob() 函数

用于匹配文件路径,返回所有匹配的文件路径列表。 print (glob.glob(r"D:\*.png") 匹配符包括“*”、“?”和"[]",其中“*”表示匹配任意字符串,“?”匹配任意单个字符,[0-9]与[a-z]表示匹配0-9的单个数字…

[改善Java代码]若有必要,使用变长数组

Java中的数组是定长的,一旦经过初始化声明就不可改变长度,这在实际使用的时候非常不方便.比如要对一个班级的学生信息进行统计,因为我们不知道班级会有多少个学生(随时可能有退学,入学,转学),所以需要一个足够大的数组来容纳所有的学生.可以通过对数组扩容解决该问题. 代码如下…

人类正在进入超级智能时代,论一种新超级智能的崛起

本文发表在2019年7月30号《社会科学报》,是刘锋根据2019年7月出版的著作《崛起的超级智能:互联网大脑》核心内容撰写的一篇文章,也感谢刘慈欣,张亚勤,周鸿祎,王飞跃,约翰.翰兹等专家和好友推荐。…

python实现随机乱序/洗牌

import randomrandom.shuffle(a) # a是一个列表