python+opencv系列教程(3)——Numpy数组操作

  • 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的数组操作代码

  1. import cv2 as cv
  2. import numpy as np
  3. def access_pixels(image):
  4.     print(image.shape)
  5.     height = image.shape[0]
  6.     width = image.shape[1]
  7.     channels = image.shape[2]
  8.     print("width:%s,height:%s,channel:%s" % (width, height, channels))
  9.     for row in range(height):
  10.         for col in range(width):
  11.             for c in range(channels):
  12.                 pv = image[row, col, c]
  13.                 image[row, col, c] = 255 - pv
  14.     cv.imshow("pixels_demo", image)
  15. def create_image():
  16.     img = np.zeros([500, 400, 3], np.uint8)
  17.     img[:, :, 0] = np.ones([500, 400])*255  # 将所有像素点的Blue通道置为255
  18.     img[0:100, 0:40, 1] = np.ones([100, 40])*255  # 将高度在0-100,宽度在0-40内的区域的Green通道置为255
  19.     img[400:500, 360:400, 2] = np.ones([100, 40])*255  # 将高度在400-500,宽度在360-400内的区域的Red通道置为255
  20.     cv.imshow("new image", img)
  21. print("start")
  22. src = cv.imread("C:/Users/Admin/Desktop/1.jpg")  # 读取图像
  23. cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)  # 创建显示图像的窗口
  24. cv.imshow("input image", src)  # 显示图片到特定的窗口中
  25. t1 = cv.getTickCount()
  26. access_pixels(src)
  27. t2 = cv.getTickCount()
  28. time = (t2-t1)/cv.getTickFrequency()
  29. print("time:%s ms " % (time*1000))
  30. # print("time:%s ms " % (((t2-t1)/cv.getTickFrequency())*1000))
  31. create_image()
  32. cv.waitKey(0)  # 等待用户操作,0为一直等待,5000为等待用户操作5s
  33. cv.destroyAllWindows()  # 释放所有内存

3 讲解

  3.1 图像的基础知识

一般的彩色图像由三维数组组成,三个维度分别代表高度、宽度和通道(R,G,B),用numpy构建一个三维数组[4,5,3]表示左上角为[0,0]点,高度为4,宽度为5,3通道的彩色图。三维数组中第一个维度代表图像的高,第二个维度代表图像的宽,第三维度代表通道,通道维度,0代表蓝色,1代表绿色,2代表红色。最终生成一个宽度为5,高度为4的彩色图像。

python+opencv系列教程(3)——Numpy数组操作

  3.2 生成简单图像

从print("start")开始,读取图片并显示,读取图片内容可参考python+opencv系列教程(2)——图像加载与保存。access_pixels获得图像数据,并通过shape属性获取图像形状,0代表高度,1代表宽度,2代表通道。image[row, col, c]获取某个像素具体的通道数值,再用255减去,得到反色数值,并显示。

python+opencv系列教程(3)——Numpy数组操作

getTickCount()是毫秒级别的计时函数,记录了系统启动以来的时间毫秒,getTickFrequency用于返回CPU的频率,就是每秒的计时周期数,print("time:%s ms " % (time*1000))表示access_pixels(src)函数执行的耗时毫秒数,可以看出,这种三层遍历方式非常耗时。

python+opencv系列教程(3)——Numpy数组操作

  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,结合之前的蓝色,此区域显示为紫色。

python+opencv系列教程(3)——Numpy数组操作

阿拉灯aladeng

发表评论

您必须才能发表评论!