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

(一)像素访问

在第一篇博客中,向大家介绍了,所谓的图像在计算机看来就是一个矩阵,对于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()相同的效果,这里就不介绍了。

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

  1. Python OpenCV 图像处理之 图像运算和图像位运算知识补充

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧.本篇博客是这个系列的第 51 篇. 该系列文章导航参考:https://blog.csdn.net/hihell/categ ...

  2. Python OpenCV 图像处理之直方图的应用,取经之旅第 26 天

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧. Python OpenCV 基础知识铺垫 cv2.compareHist 函数 橡皮擦的小节 基础知识铺垫 上篇博客 Py ...

  3. Python图像处理二:图像像素的访问与数据类型

    图像像素的访问与数据类型 图像读入程序中后,是以numpy数组存在的,因此对numpy数组的一切功能,对图像也适用.对数组元素的访问,实际上就是对图像像素点的访问. 一.图像像素的访问 彩色图像访问方 ...

  4. Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图

    一步一步来吧 上一节:Python+Opencv图像处理新手入门教程(一):介绍,安装与起步 1.什么是图像 对于计算机而言,图像的本质是一个由像素点构成的矩阵. 例如我们用肉眼很容易分辨一辆汽车的后 ...

  5. Python+OpenCV图像处理(五)——图像阈值和二值化

    系列文章 Python+OpenCV图像处理(一)--OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)--几何变换 Python+OpenCV图像处理(三)--彩色空间互换 P ...

  6. 《OpenCv视觉之眼》Python图像处理二十一:Opencv图像处理之图像线性变换和非线性变换的方法及原理

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  7. Python+Opencv图像处理新手入门教程(三):阈值与二值化

    一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图 1.Intro 今天这节我们主要研究利用阈值处理图像.例如对于输入图像: 如何做一 ...

  8. 用python怎么样实现图像二值化_使用Python+OpenCV如何实现图像二值化

    使用Python+OpenCV如何实现图像二值化 发布时间:2020-10-26 14:15:52 来源:亿速云 阅读:77 作者:蛋片鸡 这篇文章运用简单易懂的例子给大家介绍使用Python+Ope ...

  9. 数字图像处理二维码识别 python+opencv实现二维码实时识别

    数字图像处理二维码识别 python+opencv实现二维码实时识别 特点: (1)可以实现普通二维码,条形码: (2)解决了opencv输出中文乱码的问题 (3)增加网页自动跳转功能 (4)实现二维 ...

最新文章

  1. ClickHouse系列教程六:源码分析之Debug编译运行
  2. gitlab介绍、安装及gitlab CI、与jenkins的对比
  3. HDU 4020 Ads Proposal
  4. 2016 Top 10 Android Library
  5. 分布式与人工智能课程(part10)--图像库的基本使用
  6. hdu3068马拉车
  7. ssl初一组周六模拟赛【2018.4.7】
  8. keepalived实现高可用nginx反向代理的简单案例
  9. asterisk1.8 拨号方案 mysql存储(动态)
  10. shiro使用jdbc_realm登录验证
  11. 11届蓝桥杯青少年组C++全国赛高级组 六.编程实现:求阶乘(python3实现)
  12. JavaScript学习---JavaScript基础知识
  13. 个人对stacking的思想理解
  14. hashmap put过程_阿里面试官:HashMap数据结构之道
  15. #洛谷oj:P2024 [NOI2001] 食物链
  16. 12万字 | 2021数据安全与个人信息保护技术白皮书(附下载)
  17. php之sprintf的用法,PHP之sprintf函数用法详解_PHP
  18. 日常记账后,图表查看账目类别
  19. Specification同时实现模糊查询、排序、分页
  20. 2、解读中台 -- 中台的作用

热门文章

  1. java数组显示最大值,java 如何用方法在数组中找到最大值并显示他的名称?
  2. ACL'21 | debug完的神经网络,如何测试是否仍然存在bug?
  3. 论文浅尝 - ACL2021 | 探讨跨句事件联合抽取问题
  4. requirements.txt一键安装项目所需要的的python包
  5. 随机森林RF、XGBoost、GBDT和LightGBM的原理和区别
  6. Linux系统中Oracle数据库使用SELECT语句检索数据(1)实例应用
  7. 斯坦福完全可解释深度神经网络:你需要用决策树搞点事
  8. MySQL 5.7.18 解压版安装
  9. 大数据世界要熟悉的5门语言
  10. 笔记一 Redis基础