Python OpenCV(二) Numpy数组操作

一、遍历图片像素

import cv2 as cv

#函数——遍历像素取反后显示图片

def access_pixels(image):

    width = image.shape[0]

    height = image.shape[1]

    channels = image.shape[2]

    print("width = %s,height = %s,channels = %s"%(width,height,channels))

    for iin range(width):

        for jin range(height):

            for kin range(channels):

                pv = image[i,j,k]

                image[i,j,k]=255-pv

          cv.imshow("pixels_b",image)

#载入并显示图片

img = cv.imread("D:/temp/img/f1.jpg")

cv.imshow("Image",img)

#调用函数

access_pixels(img)

#等待键盘输入并关闭所有窗口

cv.waitKey(0)

cv.destroyAllWindows()

二、创建一张新图,使用通道及像素简单控制其色彩

1、创建一张3通道新图

import cv2 as cv

import  numpy as np

pic = np.zeros([666,666,3],np.uint8)  #创建一个3通道,第一个参数是形状,第二个是类型

pic[:,:,2] = np.ones([666,666])*255  #通过控制通道和像素值确定呈现的色彩

cv.imshow("new_pic",pic)

cv.waitKey(0)

cv.destroyAllWindows()

2、创建一张单通道新图

import cv2 as cv

import  numpy as np

pic = np.zeros([666,666,1],np.uint8)

pic[:, :, 0] = np.ones([666, 666]) *127  #单通道127对应灰色

cv.imshow("new_pic",pic)

cv.waitKey(0)

cv.destroyAllWindows()

三、知识点整理

1、zeros和ones

np.zeros(size,dtype) 可以创建任意维度的数组,新建图片内所有像素值均为0

np.ones(size,dtype) 可以创建任意维度的数组,新建图片内所有像素值均为1

以下代码:

pic = np.zeros([666,666,1],np.uint8)

pic[:, :, 0] = np.ones([666, 666]) *127

可以单使用ones代替为:

pic = np.ones([666, 666, 1],np.uint8)*127

2、Numpy数组的基本操作

m1 = np.ones([3,3],np.float32)  #新建一个3行3列的数组,数据类型为float32

m1.fill(12222.38)  #m1数组中所有值都赋值为12222.38

print(m1)

m2 = m1.reshape([1,9])  #把m1变为1行9列的数组m2

3、计算函数执行时间

在本文一中加入以下代码,可计算函数执行所需时间:

t1 = cv.getTickCount()

access_pixels(src)#需要测试时间的函数

t2 = cv.getTickCount()

time = (t2-t1)/cv.getTickFrequency()5print("time : %s ms"%(time*1000))

4、python中像素取反的基本操作

本文一中像素取反的函数效率低,实际编程中直接调用python中已有的API可极大提升效率。

access_pixels(image)函数可改为以下函数:

def inverse(image):

    des = cv.bitwise_not(image)

    cv.imshow("inverse demo",des)

你可能感兴趣的:(Python OpenCV(二) Numpy数组操作)