博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenCV初学浅记:numpy对于图像的基本操作,将数字和颜色联系起来,真有你的cv。
阅读量:3968 次
发布时间:2019-05-24

本文共 4040 字,大约阅读时间需要 13 分钟。

本篇文章细讲了一些numpy对于图像的一些基本的处理。以及一些numpy的基本操作。完整代码在结尾

文章目录


1.numpy

numpy是什么

numpy是python的一个开源数据计算拓展库,提供了大量且高效的对矩阵和多维数据的算法,这些结构比python本身的数据要高效很多。同时针对数组也提供了大量的运算法。

numpy下载

如果电脑python环境已经正常的情况下,可以直接用在cmd(命令提示符)pip 命令下载python,如下:

在这里插入图片描述

pip install numpy -i https://pypi.douban.com/simple/

这是我已经安装好numpy的情况下。如果该命令有问题的话,大概cmd会提示,只需要给后面加上一个trust…就可以了。

测试是否下载成功,如下代码

import numpy as npay=np.zeros([4,4],np.uint8)print(ay)

结果如下:

在这里插入图片描述
这段代码其实就是构建了一个每个元素都是0的4*4的矩阵,并打印出来。
如果正常的话,表示已经安装成功了。

2.操作图像

利用numpy操作读取出的图像

这里将对numpy的操作直接隐身在代码之中,通过代码块的注释详解。完整代码在最后

读取图像的代码详解在上一篇博客

如上一篇文章所说,我们知晓,对于计算机来说,图像其实就是一个多维的矩阵,或者说得在泛化一些,一般的图像其实就是一个三维的矩阵。
为什么是三维呢?我们知道以前的黑白电视,它是没有其他颜色的,直到三原色可以引入到像素点上,这时候才有了彩电。而这所谓的3维的3,其实指的是三原色,我们再输出图像属性的时候,会有个高,宽,通道,可以发现一般的图像通道都是3,而我们可以通过对一张黑图的操作,将这一点展现的很清楚。这一点下面会细说到。
直接看代码:
我们首先创造一张黑图,对黑图进行操作

import cv2 as cvimport numpy as npdef creat_image():    #初始为黑图    #numpy.zeros()方法:一般两个参数,第一个参数是矩阵的维度,第二个参数是dtype也就是数据位数,或者说字节数,无符号八位表示数值的范围是0~255,很容易理解,2的8-1次方-1+2的8-1次方。返回值为一个设定维度和数据类型的全0矩阵    image=np.zeros([400,400,3],np.uint8)

运行如上方法时,我们获取了一张三个通道,高宽为400的’黑图’。说黑图,是字面意思,确实是纯黑色的图。。。如下:

在这里插入图片描述

对通道0进行操作

#修改为蓝图 #numpy.ones()方法:与先前的numpy.zeros是同样的参数,即矩阵维度和数据位数,这里我是直接省略了位数,因为默认的参数也可以使用。返回的是一个设定维数和数据位数的全1矩阵。    image[:,:,0]=np.ones([400,400])*255
  • 这一步本质为矩阵的赋值兼乘法运算,这里的全1矩阵,每个元素为1,乘以255后,每个元素都是255,这时候就会imshow就会发现是一张全蓝图

如下:

在这里插入图片描述
这里就涉及到我上面要说的东西了,3,表示三原色,用我的理解来说,这里每个元素的数值应该代表的是该通道原色的亮度,为了验证这一点,我们可以来分析一下,如果该数值代表亮度的话,那意味着0即是黑色,如果我们将矩阵的每一个通道维全部化为0,那不就相当于是开头的那一步操作吗,那不正是黑图吗,这表示该数值确实可以在一定程度上代表三原色的亮度。那么同理,我们可以对通道1,通道2进行操作,获取绿图和红图。如下

#修改为绿图    image[:,:,1]=np.ones([400,400])*255    #修改为红图    image[:,:,2]=np.ones([400,400])*255

那么也很容易想到,当三个通道为皆全部为255时,就是三原色的混合,即白色,没问题把。

#得到结论 三通道对应三原色 并且三原色和在一块时也就是说,这些操作共同执行时,得到的是白图 也可以一步    image[:,:,:]=np.ones([400,400,3],np.uint8)*255

在这里插入图片描述

修改读取的图像

上面已经说过对纯色图的操控,那么同理我们自然可以操作读取的图像文件。

这里我们用遍历操作,其实是十分低效的,完全可以使用numpy不过本篇不讲该方法。留作自己思考问题(其实很容易实现)

def get_image_info(image):    height=image.shape[0]    width=image.shape[1]    channels=image.shape[2]    print('height: {},width: {},channels: {}'.format(image.shape[0],image.shape[1],image.shape[2]))    for i in range(height):        for j in range(width):            for c in range(channels):                cv=image[i,j,c]                image[i,j,c]=255-cv    return image

这里对读取到的图像信息进行一系列操作后,返回一个新的图像信息(多维矩阵)并imshow,就会产生一个很恐怖的图像。😂

如下:
这是正常图片:
在这里插入图片描述
这是亮度转化后的:
。。。
在这里插入图片描述离谱好吧。😂不过也还好,不是什么正常的转化,也得不到正常的结果。

计算修改执行的时间,cv内部有可以计时的方法

def get_time(t1,t2):    print('time: {}ms'.format((t2-t1)/cv.getTickFrequency()*1000))src=cv.imread('test_1.png')#获取运行前时间t1=cv.getTickCount()src=get_image_info(src)##获取运行后时间t2=cv.getTickCount()get_time(t1,t2)

这里解释一下,getTickCount是返回计时周期数,getTickFrequency是返回一秒内重复的次数即频率,那么时间就很容易计算,(总次数)/每秒的次数=时间(秒),这里乘1000是得到毫秒。

4.完整代码:

#import cv2 as cv#import numpy as np#def get_image_info(image):#    height=image.shape[0]#    width=image.shape[1]#    channels=image.shape[2]#    print('height: {},width: {},channels: {}'.format(image.shape[0],image.shape[1],image.shape[2]))#    for i in range(height):#        for j in range(width):#            for c in range(channels):#                cv=image[i,j,c]#                image[i,j,c]=255-cv#    return image#def get_time(t1,t2):#    print('time: {}ms'.format((t2-t1)/cv.getTickFrequency()*1000))#def creat_image():        #初始为黑图    #image=np.zeros([400,400,3],np.uint8)    #修改为蓝图    #image[:,:,0]=np.ones([400,400])*255    #修改为绿图    #image[:,:,1]=np.ones([400,400])*255    #修改为红图    #image[:,:,2]=np.ones([400,400])*255    #得到结论 三通道对应三原色 并且三原色和在一块时也就是说,这些操作共同执行时,得到的是白图 也可以一步    #image[:,:,:]=np.ones([400,400,3],np.uint8)*255    '''    #单通道127为灰图    image=np.ones([400,400,1],np.uint8)*127    '''#    return image        #src=cv.imread('test_1.png')#获取运行前时间#t1=cv.getTickCount()#src=get_image_info(src)##获取运行后时间#t2=cv.getTickCount()#get_time(t1,t2)#获取图片之后需要一个GUI显示出来#cv.namedWindow('input_1',cv.WINDOW_AUTOSIZE)#cv.imshow('input_1',src)#cv.waitKey(0)#cv.destroyAllWindows()

5.reshape

代码

import numpy as npm1=np.ones([3,3],np.uint8)*127print(m1)#维度转化。、m2=m1.reshape(1,9)print(m2)

总结

本文提到了numpy对于图像的一些基本操作,这些操作是必要掌握的,同时还有对于图像数据的一些理解,这些理解有利于后面的学习。

转载地址:http://fkcki.baihongyu.com/

你可能感兴趣的文章
Lucene 基础指南
查看>>
浏览器地址栏中加入ico图标
查看>>
Struts2文件的上传和下载
查看>>
Eclipse文件改变编码插件
查看>>
FreeMarker使用小结
查看>>
acegi-security-samples-contacts分析
查看>>
Acegi 设计概述
查看>>
让页面变得更快一点-HTML解析原理
查看>>
《谁在谋杀中国经济》与程序员
查看>>
The hierarchy of the type is inconsistent
查看>>
SpringSide 3 中的安全框架 Spring Security 2.0
查看>>
使用 CAS 在 Tomcat6 中实现单点登录
查看>>
如何成为强大的程序员?
查看>>
打包时sun.misc.ServiceConfigurationError
查看>>
摘自 管理自己[Managing Oneself]
查看>>
程序员开发大型应用程序的技巧
查看>>
远程团队管理的10条戒律
查看>>
在服务器上排除问题的头五分钟
查看>>
Diagnosing DFC Configuration Problems
查看>>
jboss java.lang.NoClassDefFoundError: Could not initialize class com.documentum.fc.client.DfClient
查看>>