本文共 4040 字,大约阅读时间需要 13 分钟。
本篇文章细讲了一些numpy对于图像的一些基本的处理。以及一些numpy的基本操作。完整代码在结尾
numpy是python的一个开源数据计算拓展库,提供了大量且高效的对矩阵和多维数据的算法,这些结构比python本身的数据要高效很多。同时针对数组也提供了大量的运算法。
如果电脑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的矩阵,并打印出来。 如果正常的话,表示已经安装成功了。这里将对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
如下:
这里就涉及到我上面要说的东西了,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,就会产生一个很恐怖的图像。😂
如下: 这是正常图片: 这是亮度转化后的: 。。。 离谱好吧。😂不过也还好,不是什么正常的转化,也得不到正常的结果。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是得到毫秒。
#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()
代码
import numpy as npm1=np.ones([3,3],np.uint8)*127print(m1)#维度转化。、m2=m1.reshape(1,9)print(m2)
本文提到了numpy对于图像的一些基本操作,这些操作是必要掌握的,同时还有对于图像数据的一些理解,这些理解有利于后面的学习。
转载地址:http://fkcki.baihongyu.com/