摘要:本篇文章主要讲解 OpenCV+Numpy 图像处理基础知识,包括读取像素和修改像素。

本文分享自华为云社区《[Python图像处理] 二.OpenCV+Numpy库读取与修改像素》,作者: eastmount。

一.传统读取像素方法

1.灰度图像,返回灰度值。

返回值=图像(位置参数),例:p = img[88,142] print§

  1. # -*- coding:utf-8 -*-
  2. import cv2
  3.  
  4. #读取图片
  5. img = cv2.imread("picture.bmp", cv2.IMREAD_UNCHANGED)
  6.  
  7. #灰度图像
  8. p = img[88, 142]
  9. print(p)
  10.  
  11. #显示图像
  12. cv2.imshow("Demo", img)
  13.  
  14. #等待显示
  15. cv2.waitKey(0)
  16. cv2.destroyAllWindows()
  17.  
  18. #写入图像
  19. cv2.imwrite("testyxz.jpg", img)

输出结果如下图所示:[131 131 131],由于该图是24位BMP,B=G=R输出三个相同的结果,有的图像仅有一个像素点则输出一个值。

2.BGR图像,返回值为B、G、R的值。

例:

b = img[78, 125, 0] print(b)
g = img[78, 125, 1] print(g)
r = img[78,125, 2] print

  1. # -*- coding:utf-8 -*-
  2. import cv2
  3.  
  4. #读取图片
  5. img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
  6.  
  7. #BGR图像
  8. b = img[78, 125, 0]
  9. print(b)
  10. g = img[78, 125, 1]
  11. print(g)
  12. r = img[78, 125, 2]
  13. print(r)
  14.  
  15. #方法二
  16. bgr = img[78, 125]
  17. print(bgr)
  18.  
  19. #显示图像
  20. cv2.imshow("Demo", img)
  21.  
  22. #等待显示
  23. cv2.waitKey(0)
  24. cv2.destroyAllWindows()
  25.  
  26. #写入图像
  27. cv2.imwrite("testyxz.jpg", img)

输出像素和图像如下所示:

155
104
61
[155 104 61]

二.传统修改像素方法

1.修改单个像素值

BGR图像可以通过位置参数直接访问像素值并进行修改,输出结果如下所示:

  1. # -*- coding:utf-8 -*-
  2. import cv2
  3.  
  4. #读取图片
  5. img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
  6.  
  7. #BGR图像
  8. print(img[78, 125, 0])
  9. print(img[78, 125, 1])
  10. print(img[78, 125, 2])
  11.  
  12. #修改像素
  13. img[78, 125, 0] = 255
  14. img[78, 125, 1] = 255
  15. img[78, 125, 2] =255
  16.  
  17. print(img[78, 125])
  18. img[78, 125] = [10, 10, 10]
  19. print(img[78, 125, 0])
  20. print(img[78, 125, 1])
  21. print(img[78, 125, 2])
  22. #方法二
  23. print(img[78, 125])
  24. img[78, 125] = [10, 10, 10]
  25. print(img[78, 125])

输出结果如下所示,通过两种方法分别将B、G、R像素值修改为255和0。

155
104
61
255
255
255
[255 255 255]
[10 10 10]

2.修改区域像素

通过访问图像数组的位置区域实现区域像素修改,比如 [100:150,400:500] 是访问第100到150行,400到500列的区域,再对该区域像素进行修改。代码如下所示:

  1. # -*- coding:utf-8 -*-
  2. import cv2
  3.  
  4. #读取图片
  5. img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
  6.  
  7. #BGR图像
  8. img[100:150, 400:500] = [255, 255, 0]
  9.  
  10. #显示图像
  11. cv2.imshow("Demo", img)
  12.  
  13. #等待显示
  14. cv2.waitKey(0)
  15. cv2.destroyAllWindows()
  16.  
  17. #写入图像
  18. cv2.imwrite("testyxz.jpg", img)

输出结果如下图所示,[255, 255, 0]是浅蓝色。

三.Numpy读取像素方法

使用Numpy进行像素读取,调用方式如下:

返回值 = 图像.item(位置参数)

  1. # -*- coding:utf-8 -*-
  2. import cv2
  3. import numpy
  4.  
  5. #读取图片
  6. img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
  7.  
  8. #Numpy读取像素
  9. blue = img.item(78, 100, 0)
  10. green = img.item(78, 100, 1)
  11. red = img.item(78, 100, 2)
  12. print(blue)
  13. print(green)
  14. print(red)
  15.  
  16. #显示图像
  17. cv2.imshow("Demo", img)
  18.  
  19. #等待显示
  20. cv2.waitKey(0)
  21. cv2.destroyAllWindows()

输出结果如下,注意OpenCV读取图像通道是BGR,也可以转换成RGB在进行处理。

155
104
61

四.Numpy修改像素方法

使用Numpy的itemset函数修改像素,调用方式如下:

图像.itemset(位置, 新值)

例如:img.itemset((88,99), 255)

  1. # -*- coding:utf-8 -*-
  2. import cv2
  3. import numpy
  4.  
  5. #读取图片
  6. img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
  7.  
  8. #Numpy读取像素
  9. print(img.item(78, 100, 0))
  10. print(img.item(78, 100, 1))
  11. print(img.item(78, 100, 2))
  12. img.itemset((78, 100, 0), 100)
  13. img.itemset((78, 100, 1), 100)
  14. img.itemset((78, 100, 2), 100)
  15. print(img.item(78, 100, 0))
  16. print(img.item(78, 100, 1))
  17. print(img.item(78, 100, 2))

输出结果如下:

155
104
61
100
100
100

也可以同时输出B、G、R三个值,核心代码如下:

  1. print(img[78, 78])
  2. img.itemset((78, 78, 0), 0)
  3. img.itemset((78, 78, 1), 0)
  4. img.itemset((78, 78, 2), 0)
  5. print(img[78, 78])
  6. #[155 104 61]
  7. #[0 0 0]

本文摘录自eastmount X华为云开发者社区联合出品的电子书《从零到一 • Python图像处理及识别》。

点击免费下载电子书《从零到一 • Python图像处理及识别》

点击关注,第一时间了解华为云新鲜技术~

Python图像处理丨OpenCV+Numpy库读取与修改像素的更多相关文章

  1. 用python的matplotlib和numpy库绘制股票K线均线和成交量的整合效果(含量化验证交易策略代码)

    在用python的matplotlib和numpy库绘制股票K线均线的整合效果(含从网络接口爬取数据和验证交易策略代码)一文里,我讲述了通过爬虫接口得到股票数据并绘制出K线均线图形的方式,在本文里,将 ...

  2. 【转】Python xlrd、xlwt、xlutils读取、修改Excel文件

    Python xlrd.xlwt.xlutils读取.修改Excel文件 一.xlrd读取excel 这里介绍一个不错的包xlrs,可以工作在任何平台.这也就意味着你可以在Linux下读取Excel文 ...

  3. Python图像处理丨基于OpenCV和像素处理的图像灰度化处理

    摘要:本篇文章讲解图像灰度化处理的知识,结合OpenCV调用cv2.cvtColor()函数实现图像灰度操作,使用像素处理方法对图像进行灰度化处理. 本文分享自华为云社区<[Python图像处理 ...

  4. Python图像处理丨图像腐蚀与图像膨胀

    摘要:本篇文章主要讲解Python调用OpenCV实现图像腐蚀和图像膨胀的算法. 本文分享自华为云社区<[Python图像处理] 八.图像腐蚀与图像膨胀>,作者: eastmount . ...

  5. Python图像处理丨带你认识图像量化处理及局部马赛克特效

    摘要:本文主要讲述如何进行图像量化处理和采样处理及局部马赛克特效. 本文分享自华为云社区<[Python图像处理] 二十.图像量化处理和采样处理及局部马赛克特效>,作者: eastmoun ...

  6. 跟我学Python图像处理丨带你掌握傅里叶变换原理及实现

    摘要:傅里叶变换主要是将时间域上的信号转变为频率域上的信号,用来进行图像除噪.图像增强等处理. 本文分享自华为云社区<[Python图像处理] 二十二.Python图像傅里叶变换原理及实现> ...

  7. 跟我学Python图像处理丨获取图像属性、兴趣ROI区域及通道处理

    摘要:本篇文章主要讲解Python调用OpenCV获取图像属性,截取感兴趣ROI区域,处理图像通道. 本文分享自华为云社区<[Python图像处理] 三.获取图像属性.兴趣ROI区域及通道处理 ...

  8. Python图像处理丨三种实现图像形态学转化运算模式

    摘要:本篇文章主要讲解Python调用OpenCV实现图像形态学转化,包括图像开运算.图像闭运算和梯度运算 本文分享自华为云社区<[Python图像处理] 九.形态学之图像开运算.闭运算.梯度运 ...

  9. 跟我学Python图像处理丨基于灰度三维图的图像顶帽运算和黑帽运算

    摘要:本篇文章结合灰度三维图像讲解图像顶帽运算和图像黑猫运算,通过Python调用OpenCV函数实现. 本文分享自华为云社区<[Python图像处理] 十三.基于灰度三维图的图像顶帽运算和黑帽 ...

随机推荐

  1. sqlmap之waf绕过

    #一点补充 在老版本的安全狗中,可通过构造payload: http://xx.xx.xx.xx/sqli-labs/Less-2/index.php/x.txt?id=1 and 1=1 可通过in ...

  2. gitLab上dev分支上的内容都拉取到本地了

    从dev分支上更新代码 1.与远程仓库建立连接:git remote add origin XXXXX.git 2.使用git branch 查看本地是否具有dev分支 3.如果没有 git fetc ...

  3. CF1430F Realistic Gameplay (贪心+DP)

    朴素做法暴力DP,O(nk)过不去... 1 #include <cmath> 2 #include <cstdio> 3 #include <cstring> 4 ...

  4. Minikube使用文档

    最近在参与社区flink-operator的开发,开发的过程中经常使用到minikube来本地验证这篇文章记录下相关使用 安装 https://minikube.sigs.k8s.io/docs/st ...

  5. Servlet:浏览器下载文件时文件名为乱码问题

    1 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcep ...

  6. eclipse启动指定jvm的版本

    参阅:https://www.eclipse.org/forums/index.php/t/1105435/ https://wiki.eclipse.org/Eclipse.ini#-vm_valu ...

  7. 比较一下 Java 和 JavaSciprt?

    JavaScript 与 Java 是两个公司开发的不同的两个产品.Java 是原 Sun Microsystems 公司推出的面向对象的程序设计语言,特别适合于互联网应用程序 开发:而 JavaSc ...

  8. Linux Yum仓库源配置

    Yum概念:Yum软件仓库的作用是为了进一步简化RPM管理软件的难度以及自动分析所需软件包及其依赖关系的技术 Yum配置仓库源放置位置:/etc/yum.repo.d/ :配置文件需以 .repo 结 ...

  9. idea中Git的配置和Github上推拉项目

    1.去官网下载Git,并且安装它.安装步骤较为简单,此处就不再赘述. 2.在idea中配置Git信息 Git路径就是你电脑中安装Git的位置,找到git.exe文件(正常情况下,idea都会自动给你匹 ...

  10. 10.Flink实时项目之订单维度表关联

    1. 维度查询 在上一篇中,我们已经把订单和订单明细表join完,本文将关联订单的其他维度数据,维度关联实际上就是在流中查询存储在 hbase 中的数据表.但是即使通过主键的方式查询,hbase 速度 ...