1、上次介绍了一点点numpy的操作,今天我们来介绍它如何用多维数组操作图片,这之前我们要了解一下色彩是由blue ,green ,red 三种颜色混合而成,0:表示黑色 ,127:灰色 ,255:白色 ;接下来我们还是来看代码:
1 import cv2 as cv 2 import numpy as np 3 4 5 def access_piexls(image): 6 print(image.shape) #获取图像的形状大小 7 height=image.shape[0] #图像的第一维度高度 8 width=image.shape[1] #图像的第二维度宽度 9 channels=image.shape[2] #图像的第三维度通道数 10 print("height : %s , width :%s , channels: %s"%(height,width,channels)) 11 for row in range(height): 12 for col in range(width): 13 for c in range(channels): 14 pv=image[row,col,c] #一个三维数组,来获取每个维度的值 15 image[row,col,c]=255-pv #修改它的颜色显示 16 cv.imshow("hhhh",image) 17 src=cv.imread("D:\hh.JPG") #blue green red 色彩通道,这是基本的色彩构成,后面会学到 0:表示黑色 255:表示白色 18 19 cv.namedWindow('input image',0) 20 cv.imshow('input image',src) 21 t1=cv.getTickCount() #获取当前cpu转动的时间 22 access_piexls(src) 23 24 t2=cv.getTickCount() 25 print("time : %s ms" %((t2-t1)/cv.getTickFrequency()*1000)) #计算走了多少秒 26 cv.waitKey(-1) 27 cv.destoryAllWindows()
最终实现的效果如下(我们可以看到cpu 显示这这张修改后的照片时间是9秒左右,同时照片的颜色也被改变了):
2、接下来我们我可以在这个基础上创建出一张新的照片来:
1 import cv2 as cv 2 import numpy as np 3 4 5 def access_piexls(image): 6 print(image.shape) #获取图像的形状大小 7 height=image.shape[0] #图像的第一维度高度 8 width=image.shape[1] #图像的第二维度宽度 9 channels=image.shape[2] #图像的第三维度通道数 10 print("height : %s , width :%s , channels: %s"%(height,width,channels)) 11 for row in range(height): 12 for col in range(width): 13 for c in range(channels): 14 pv=image[row,col,c] #一个三维数组,来获取每个维度的值 15 image[row,col,c]=255-pv #修改它的颜色显示 16 cv.imshow("hhhh",image) 17 def creat_image(): 18 img = np.zeros([400,400,3],np.uint8) #全zeros时 创建一个图片,高为400,宽为400,三个色彩通道矩阵图像 类型为uint8,这个时候我们还没有对图片进行颜色改变 19 cv.imshow("new_img", img) 20 21 22 src=cv.imread("D:\hh.JPG") #blue green red 色彩通道,这是基本的色彩构成,后面会学到 0:表示黑色 255:表示白色 23 24 cv.namedWindow('input image',0) 25 cv.imshow('input image',src) 26 t1=cv.getTickCount() #获取当前cpu转动的时间 27 #access_piexls(src) 28 creat_image() 29 t2=cv.getTickCount() 30 print("time : %s ms" %((t2-t1)/cv.getTickFrequency()*1000)) #计算走了多少秒 31 cv.waitKey(-1) 32 cv.destoryAllWindows()
最终效果是一张黑色的照片:
3、接下来我们把这张新建的黑色照片,对它进行颜色操作,把它改成blue,也就是对颜色第一颜色通道进行多维数组操作(当然你也可以对其两个颜色通道进行修改):
1 import cv2 as cv 2 import numpy as np 3 4 5 def access_piexls(image): 6 print(image.shape) #获取图像的形状大小 7 height=image.shape[0] #图像的第一维度高度 8 width=image.shape[1] #图像的第二维度宽度 9 channels=image.shape[2] #图像的第三维度通道数 10 print("height : %s , width :%s , channels: %s"%(height,width,channels)) 11 for row in range(height): 12 for col in range(width): 13 for c in range(channels): 14 pv=image[row,col,c] #一个三维数组,来获取每个维度的值 15 image[row,col,c]=255-pv #修改它的颜色显示 16 cv.imshow("hhhh",image) 17 def creat_image(): 18 img = np.zeros([400,400,3],np.uint8) #全zeros时 创建一个图片,高为400,宽为400,三个色彩通道矩阵图像 类型为uint8,这个时候我们还没有对图片进行颜色改变 19 img[: , : , 0]=np.ones([400,400])*255 #修改第一通道的颜色为blue 对第一个颜色通道操作 20 cv.imshow("new_img", img) 21 22 23 src=cv.imread("D:\hh.JPG") #blue green red 色彩通道,这是基本的色彩构成,后面会学到 0:表示黑色 255:表示白色 24 25 cv.namedWindow('input image',0) 26 cv.imshow('input image',src) 27 t1=cv.getTickCount() #获取当前cpu转动的时间 28 #access_piexls(src) 29 creat_image() 30 t2=cv.getTickCount() 31 print("time : %s ms" %((t2-t1)/cv.getTickFrequency()*1000)) #计算走了多少秒 32 cv.waitKey(-1) 33 cv.destoryAllWindows()
4、单通道操作,更加简单:
1 import cv2 as cv 2 import numpy as np 3 4 def creat_image(): 5 img = np.ones([400,400,3],np.uint8) 6 img=img * 0 7 cv.imshow("new_img", img) 8 9 cv.waitKey(-1) 10 cv.destoryAllWindows()
5、填充操作(当我们把创建的图片大小取小一点的话,我可以用fill(进行填充操作):
1 import cv2 as cv 2 import numpy as np 3 4 def creat_image(): 5 m1 = np.ones([3,3],np.uint8) 6 m1.fill(122) 7 print(m1) 8 9 m2=m1.reshape([1,9]) #把一行分为9列 10 print(m2) 11 12 13 14 15 16 src=cv.imread("D:\hh.JPG") #blue green red 色彩通道,这是基本的色彩构成,后面会学到 0:表示黑色 255:表示白色 17 18 cv.namedWindow('input image',0) 19 cv.imshow('input image',src) 20 t1=cv.getTickCount() #获取当前cpu转动的时间 21 #access_piexls(src) 22 creat_image() 23 t2=cv.getTickCount() 24 print("time : %s ms" %((t2-t1)/cv.getTickFrequency()*1000)) #计算走了多少秒 25 cv.waitKey(-1) 26 cv.destoryAllWindows()
6、接下来用bitwise_not()函数实现像素取反,这样操作后读取照片的时间就非常快了:
1 import cv2 as cv 2 import numpy as np 3 #进行像素取反操作,可以使读取照片的速度加快 4 5 def inverse(img): 6 dst=cv.bitwise_not(img) 7 cv.imshow("取反",dst) 8 src=cv.imread("D:\hh.JPG") #blue green red 色彩通道,这是基本的色彩构成,后面会学到 0:表示黑色 255:表示白色 9 10 cv.namedWindow('input image',0) 11 cv.imshow('input image',src) 12 t1=cv.getTickCount() #获取当前cpu转动的时间 13 #access_piexls(src) 14 inverse(src) 15 t2=cv.getTickCount() 16 print("time : %s ms" %((t2-t1)/cv.getTickFrequency()*1000)) #计算走了多少秒 17 cv.waitKey(-1) 18 cv.destoryAllWindows()
以上就是今天所学的东西了,就分享到这里了,睡觉了,现在是凌晨12:36,。