opencv学习三:numpy数组操作

一、读取一张图片,修改颜色通道后输出

可以得到图像的:行数,列数,通道数的矩阵,对矩阵进行操作可改变图像像素
代码如下:

import cv2 as cv  #导入cv模块
import numpy as np #np科学计数的包,通过numpy对数据进行处理

def access_pixels(image):
    print(image.shape)
    height = image.shape[0] #图像的第一维度 高度
    width = image.shape[1] #图像的第二维度 宽度
    channels = image.shape[2] #图像的第三维度 通道数目
    print("width : %s,height : %s,channels : %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)
    
src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/lena.jpg")  #读取图片位置
#blue green red
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)  #创建一个GUI
cv.imshow("input image", src) #对窗口图片进行展示
t1 = cv.getTickCount()
access_pixels(src)
t2 = cv.getTickCount()
time = (t2 - t1)*1000/cv.getTickFrequency()
print("time : %s" % time)
cv.waitKey(0)
cv.destroyAllWindows()  #释放所有的内存

运行截图:
opencv学习三:numpy数组操作_第1张图片cv::getTickCount()可以用来测量一段代码的运行时间,这个函数返回从上次开机算起的时钟周期数。

由于我们需要的是某个代码段运行的毫秒数,因此还需要另一个函数cv::getTickFrequency()。此函数返回每秒内时钟的周期数。

二、自定义一张多通道的图片

用到函数:zeros和ones
代码如下:

import cv2 as cv
import numpy as np
 
 
def create_image():
    img = np.zeros([400, 400, 3], np.uint8)#zeros:double类零矩阵  创建400*400 3个通道的矩阵图像 参数时classname为uint8
    img[:, :, 0] = np.ones([400, 400])*255#ones([400, 400])是创建一个400*400的全1矩阵,*255即是全255矩阵 并将这个矩阵的值赋给img的第一维
    img[:, :, 1] = np.ones([400, 400])*255#第二维全是255
    img[:, :, 2] = np.ones([400, 400])*255#第三维全是255
    cv.imshow("new image", img)#输出一张400*400的白色图片(255 255 255):蓝(B)、绿(G)、红(R)
 
create_image()
cv.waitKey(0)
cv.destroyAllWindows()

运行结果是输出一张白色图片 也可修改255为其他数字来输出不同颜色的图片
也可单独使用ones函数,代码如下:


import cv2 as cv
import numpy as np
 
 
def create_image():
    img = np.ones([400, 400, 3], np.uint8)
    img[:, :, 0] = img[:, :, 0]*255
    img[:, :, 1] = img[:, :, 1]*255
    img[:, :, 2] = img[:, :, 2]*255
    cv.imshow("new image", img)
 
create_image()
cv.waitKey(0)
cv.destroyAllWindows()

二:自定义一张单通道的图片

# -*- coding=GBK -*-
import cv2 as cv
import numpy as np
 
 
def create_image():
    img = np.ones([400, 400, 1], np.uint8)#该像素点只有一个通道,该函数使所有像素点的通道的灰度值为1
    img = img * 127 #使每个像素点单通道的灰度值变为127,0到255都可以,颜色由黑(0)转灰(127)转白(255)
    cv.imshow("new image", img)
 
create_image()
cv.waitKey(0)
cv.destroyAllWindows()

注意:

1.代码里 img = img * 127 表示数组里的每个数值都乘以127

2.之所以np.ones函数参数类型是uint8,是因为uint8数的范围为0~255, 那么为0时恰好为黑色,为255时恰好为白色。若函数参数类型为int8,则int8类型数的范围为-128~127,那么-128则为黑色,127为白色

对于reshape()方法的使用

opencv学习三:numpy数组操作_第2张图片
opencv学习三:numpy数组操作_第3张图片
opencv学习三:numpy数组操作_第4张图片

三、调用库函数来实现像素取反

# -*- coding=GBK -*-
import cv2 as cv
import numpy as np
 
 
#像素取反
def inverse(image):
    dst = cv.bitwise_not(image)
    cv.imshow("取反", dst)
 
 
src = cv.imread("C://1.jpg")
cv.namedWindow("原来", cv.WINDOW_NORMAL)
cv.imshow("原来", src)
t1 = cv.getTickCount()
inverse(src)
t2 = cv.getTickCount()
time = (t2 - t1)*1000/cv.getTickFrequency()
print("time: %s" % time)
cv.waitKey(0)
cv.destroyAllWindows()

调用bitwise_not函数运行时间非常快!

你可能感兴趣的:(opencv笔记,opencv,计算机视觉,python,深度学习,人脸识别)