在调用opencv的imread函数读取图像时,我们得到的其实是一个类型为numpy.ndarray的n维数组。这个数组的维度是[height,width,3],它是由每个像素的RGB通道的灰度值组成。

(img[:,:,0],img[:,:,1],img[:,:,2] 分别对应B、G、R通道。)

因此一切对于图像的操作,其实都是对于该数组的操作,在实际应用中,运用numpy和opencv模块的数组或矩阵的操作,可以大大节省处理图像的时间。

举个简单的例子,我们想得到图像某一区域内所有R通道值大于50的像素坐标,最简单的方法是用for循环:

for i in range(width):

for j in range(height):

if img[i,j,2]>50:

print(i,j)

很显然,这段算法的时间复杂度是O(n²),处理大图片非常之慢。那么有没有更好的办法呢?当然有,容我先卖个关子,让我们先来学习一些简单的数组/矩阵操作。

1.赋值

当我们需要改变图像的RGB值时,并不需要用for循环挨个赋值,而是可以直接对img数组的值进行修改。比如要将图像的灰度值取反,我们可以:

img[:,:]=255-img[:,:]

这个语句等同于opencv库的函数cv2.bitwise_not(),这样整幅图像的灰度值就都取反了。有兴趣的话,可以比较一下这两种方式的运行时间。

也可以通过设置范围,只操作图像的某一部分,比如我们要取图像的0-100行,100-200列:

img[0:100,100:200] #行数在前,列数在后,也就是图像的高度区域在前

Q.为啥不是用[255,255,255]-img[:,:]呢?

numpy的数组加减乘除一个数,就相当于数组中的每个元素依次和这个数进行运算,反之亦然。

2.图像运算

opencv中包含图像的算术和逻辑运算函数:

cv2.add(img1,img2) #图像矩阵相加(参数下同)

cv2.subtract() #图像矩阵相减

cv2.bitwise_and() #图像与运算

cv2.bitwise_or() #图像或运算

cv2.bitwise_xor() #图像异或运算

cv2.bitwise_not() #图像非运算

opencv里规定RGB通道的上限为255,下限为0,超过255或小于0的数全变成255和0,所以图像的算术运算与下列语句不同:

img=img1-img2

img=img1+img2

因为这两条语句会使灰度值“越界”,超过255值会从0循环,负数的值则从255开始循环。比如300会变成300-255=45。

3.图像的拼接

img=np.vstack((img1,img2)) #纵向合并矩阵

img=np.hstack((img1,img2)) #横向合并矩阵

可以利用上述函数实现图像的拼接,参数是一个元组,也可以包含多个图像。

Q.如果输入的图像数组维度不同会怎么样?

会报错呗还能咋的。

除了上文提到的这些,所有numpy库中有关矩阵操作的函数都可用于图像,比如求和、求最大元素等等,都能在图像处理中有所帮助。

说了这么多,文章一开始提到的for循环的算法,如何改为矩阵运算呢?其实很简单。

e=matrix(img[:,:,2]>50) #得到满足条件的位置为True,其他位置为False的bool数组

e=np.where(e != 0)

y=list(e[0])

x=list(e[1]) #x与y中的元素是一一对应的

pix=np.array([x,y]).transpose()

现在,pix数组中就是所有满足条件的点了,这个方法的运行速度,要比for循环快上十几倍!

不过,想要调用matrix,仅仅导入numpy模块是没用的,还要加上一行:

from numpy import array as matrix, arange

如果你还不满足,不但要得到这些点的坐标,还要在图上标注出来,比如得到这些点为白色,其余背景置黑的二值化图像。之前在for循环的算法中,只需要if语句下添加赋值语句即可,现在又该怎么办呢?

e1=matrix(img[:,:,2]>50)

img=np.array(e1)*255

img就是我们想要的图像啦!(符合条件的点灰度值为255,其余点为0)

python 读取图片成为一维数组_python+opencv 图像的数组和矩阵操作相关推荐

  1. python 读取图片成为一维数组_在OpenCV里图像数据与一维数组转换

    通过读取文件之后,生成的图像数据一般是二维或三维数组,每个数组元素是8位字节大小.有时候从网络里接收到一串数据,它是字节顺序的,比如有30000个字节,想要把它转换为300X100的图像大小,这个怎么 ...

  2. python 读取图片成为一维数组_OpenCV与Python之图像的读入与显示以及利用Numpy的图像转换...

    1:读入图像,显示图像与保存图像 代码: import cv2 img=cv2.imread('lena.jpg',cv2.IMREAD_COLOR) cv2.namedWindow('lena',c ...

  3. python 读取图片转换为一维向量_对Python中一维向量和一维向量转置相乘的方法详解...

    对Python中一维向量和一维向量转置相乘的方法详解 在Python中有时会碰到需要一个一维列向量(n*1)与另一个一维列向量(n*1)的转置(1*n)相乘,得到一个n*n的矩阵的情况.但是在pyth ...

  4. python读取图片上的文字_Python帮你读取图片中的文字(OCR)

    此文主要介绍如何通过Python读取图片中的文字(光学字符识别,OCR) 第一步 安装 tesseract 安装过程中注意勾选中文(chi_sim, chi_tra). 第二步 python 安装 p ...

  5. python打出由边框包围的_python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)...

    图像边框的实现 图像边框设计的主要函数 cv.copyMakeBorder()--实现边框填充 主要参数如下: 参数一:源图像--如:读取的img 参数二--参数五分别是:上下左右边的宽度--单位:像 ...

  6. python读取图片的几种方式以及图像宽和高的存储顺序

    1.opencv 2.imageio 3.matplotlib 4.scipy # coding:utf-8import cv2 import imageio from scipy import mi ...

  7. python给图片加半透明水印_Python+OpenCV为图片添加中文水印与图片水印

    OpenCV中在图片上输出中文一般有两种解决办法: 一种需要借助FreeType库实现.FreeType库是一个完全免费(开源)的.高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件. ...

  8. python下载图片被覆盖了_Python OpenCV – 覆盖透明的图像

    我想要实现的是将具有透明度的图像放在另一个图像的顶部.像这样的东西: 我一直无法找到任何解决方案,所以我决定逐像素地计算得到的颜色.那个对我有用,但速度很慢. 我是OpenCV的新手,也是Python ...

  9. python提取图片感兴趣区域_Python+OpenCV感兴趣区域ROI提取方法

    方法一:使用轮廓 步骤1 """src为原图""" ROI = np.zeros(src.shape, np.uint8) #感兴趣区域RO ...

最新文章

  1. go语言学习(6)select的使用
  2. 004-SLF4J的简单使用
  3. C++std::vector指定位置插入
  4. 中国版的stackoverflow
  5. golang plugin模块的使用
  6. Android 数据存储之SharedPreferences存储小记
  7. vijos p1433——火炬手之梦
  8. 巧用Notepad++代码粘贴功能
  9. linux查看tmp,linux下find(文件查找)命令的用法总结-tmp文件
  10. free store VS heap(自由存储区VS堆)
  11. 计算机中加密文件找不见,文件夹保护3000找不到文件夹加密记录怎么办?
  12. 在线UTF-8转换成GBK工具
  13. matlab曲线拟合成两直线,最小二乘法曲线拟合 原理及matlab实现
  14. mysql 身份证判断性别_sql根据身份证号判断所在地域、年龄、性别
  15. 网络模型(看这一篇就够了)
  16. 一只喵的西行记-12 灯火阑珊处那娃在哭
  17. 多边形近似轮廓-多边形简化
  18. 【DC系列】DC-4靶机渗透练习
  19. 示波器分析IIC波形图
  20. 2022-2023年最新最全计算机相关专业毕设选题推荐

热门文章

  1. Assembly of long, error-prone reads using repeat graphs 使用重复图组装长且容易出错的读操作
  2. centos安装ffmpeg php,lnmp下安装ffmpeg和ffmpeg-php教程
  3. ccf z字形 java_第三次CCF计算机软件能力认证题目:Z字形扫描
  4. 【文本分类】Recurrent Convolutional Neural Networks for Text Classification
  5. Linux: what's the difference between /proc/self and /proc/$$?
  6. 计算机控制z变换例题,计算机控制习题答案.doc
  7. macos nginx php mysql_mac环境下搭建nginx + php + mysql开发环境
  8. aws python sdk send sns_AWS:boto3订阅SNS时的空SQS队列
  9. UIEdgeInsets 说明
  10. ffmpeg推流_明白了以下5点思路,你也能用Python实现直播推流效果(技术活)