图片以矩阵的形式存在电脑里,需要用到数组操作来完成对图像的处理
常用的有两个API: zeros和ones
1 np.ones(size) 可以创建任意维度的数组,各个元素值均为1 2 3 np.zeros(size,dtype) 同上,但各个元素值为0.默认元素类型为浮点数
使用示例:
1 img = np.zeros([256, 256, 3], np.uint8) 2 #创建长宽为256的图片,三通道(BGR),像素大小为8位无符号整数 3 img[: , : , 0] = np.ones([256,256])*255 4 #设置图片的颜色B通道为255,也就是蓝色 5 cv.imshow("new image", img) 6 7 #单通道的灰度图像 8 img1 = np.ones([400, 400, 1], np.uint8) 9 img1 = img1 * 147 10 cv.imshow("new image", img1)
图片填充 image.fill(pixel)
转换维度 image.reshape(size)
使用示例:
1 m1 = np.ones([30, 30], np.uint8) #创建单通道的灰度图形 2 m1.fill(12) 3 print(m1) 4 cv.imshow("m1", m1) 5 #reshape注意size大小匹配 30*30=10*90 6 m2 = m1.reshape([10,90]) 7 print(m2) 8 cv.imshow("m2", m2)
对pixel的简单操作:方法一:遍历; 方法二:API
1 def access_pixels(image): 2 print(image.shape) 3 height = image.shape[0] 4 width = image.shape[1] 5 channels = image.shape[2] 6 print("width : %s, height : %s, channels : %s" %(width, height, channels)) 7 for i in range(height): 8 for j in range(width): 9 for k in range(channels): 10 pv = 255 - image[i, j, k] 11 image[i, j, k] = pv 12 cv.imshow("pixels_demo", image) 13 14 15 def inverse(image): 16 #和上一个函数的for循环功能类似 17 dst = cv.bitwise_not(image) 18 cv.imshow("inverse demo", dst)
分别运行两个函数发现使用API比循环遍历快不少。(python运行比较慢,API是C++写的)
计算函数运行时间:
1 t1 = cv.getTickCount() 2 access_pixels(src) #需要测试时间的函数 3 t2 = cv.getTickCount() 4 time = (t2-t1)/cv.getTickFrequency() 5 print("time : %s ms" %(time*1000))