- A+
1 Python的多维数组切片
- :
表示取一个维度 - data[:,n]
有一个逗号,说明有两个维度,前面一个:的前后没有值,说明是取完所有,即取完所有行,逗号后面若没有:,只有一个数字,相当于取一列,若是n,就是取第n-1列 - data[:,-1]
取最后一列 - data[:,m:n]
逗号后面又有:,说明是取几列,这里是取m到n之间的列,即m,m+1,...n-1(注意,不包括n) - data[:,:-1]
取0到倒数第二列 - data[0:1,:]
取第0行
2 opencv的数组操作代码
- import cv2 as cv
- import numpy as np
- def access_pixels(image):
- print(image.shape)
- height = image.shape[0]
- width = image.shape[1]
- channels = image.shape[2]
- print("width:%s,height:%s,channel:%s" % (width, height, channels))
- for row in range(height):
- for col in range(width):
- for c in range(channels):
- pv = image[row, col, c]
- image[row, col, c] = 255 - pv
- cv.imshow("pixels_demo", image)
- def create_image():
- img = np.zeros([500, 400, 3], np.uint8)
- img[:, :, 0] = np.ones([500, 400])*255 # 将所有像素点的Blue通道置为255
- img[0:100, 0:40, 1] = np.ones([100, 40])*255 # 将高度在0-100,宽度在0-40内的区域的Green通道置为255
- img[400:500, 360:400, 2] = np.ones([100, 40])*255 # 将高度在400-500,宽度在360-400内的区域的Red通道置为255
- cv.imshow("new image", img)
- print("start")
- src = cv.imread("C:/Users/Admin/Desktop/1.jpg") # 读取图像
- cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) # 创建显示图像的窗口
- cv.imshow("input image", src) # 显示图片到特定的窗口中
- t1 = cv.getTickCount()
- access_pixels(src)
- t2 = cv.getTickCount()
- time = (t2-t1)/cv.getTickFrequency()
- print("time:%s ms " % (time*1000))
- # print("time:%s ms " % (((t2-t1)/cv.getTickFrequency())*1000))
- create_image()
- cv.waitKey(0) # 等待用户操作,0为一直等待,5000为等待用户操作5s
- cv.destroyAllWindows() # 释放所有内存
3 讲解
3.1 图像的基础知识
一般的彩色图像由三维数组组成,三个维度分别代表高度、宽度和通道(R,G,B),用numpy构建一个三维数组[4,5,3]表示左上角为[0,0]点,高度为4,宽度为5,3通道的彩色图。三维数组中第一个维度代表图像的高,第二个维度代表图像的宽,第三维度代表通道,通道维度,0代表蓝色,1代表绿色,2代表红色。最终生成一个宽度为5,高度为4的彩色图像。
3.2 生成简单图像
从print("start")开始,读取图片并显示,读取图片内容可参考python+opencv系列教程(2)——图像加载与保存。access_pixels获得图像数据,并通过shape属性获取图像形状,0代表高度,1代表宽度,2代表通道。image[row, col, c]获取某个像素具体的通道数值,再用255减去,得到反色数值,并显示。
getTickCount()是毫秒级别的计时函数,记录了系统启动以来的时间毫秒,getTickFrequency用于返回CPU的频率,就是每秒的计时周期数,print("time:%s ms " % (time*1000))表示access_pixels(src)函数执行的耗时毫秒数,可以看出,这种三层遍历方式非常耗时。
3.3 创建复杂图像
create_image用于创建一个较为复杂的图形,zeros创建一个高度500,宽度为400的3通道的三维数组,数组中每个元素的数据类型为uint8,即创建了一个高度500,宽度为400的彩色图,图片左上角为(0,0);根据python切片语法,调用ones将通道为0即蓝色通道的所有数据设为255,即图片显示为蓝色;然后将高度在0-100,宽度在0-40内的区域的Green通道置为255,结合之前的蓝色,该区域因为亮青色;然后将高度在400-500,宽度在360-400内的区域的Red通道置为255,结合之前的蓝色,此区域显示为紫色。