图片像素取反和numpy数组操作

import cv2 as cv
import numpy as np

# 数组操作
def access_pixlex(image):
    print('返回一个元组',image.shape)
    height = image.shape[0]
    width = image.shape[1]
    channel = image.shape[2] # 3原色,所以是3
    # 打印输出,这里用format
    print("width:{0},height:{1},channel:{2}".format(width,height,channel))
    # 遍历每个像素点值,并对像素值进行修改
    # for循环遍历修改很耗时
    for row in range(height):
        for col in range(width):
            for c in range(channel):
                pv = image[row,col,c]
                image[row,col,c] = 255 - pv
    
    # 展示修改后的图片
    cv.imshow("modification",image)

def creat_image():
    #zeros:double类零矩阵 
    #  创建400*400 3个通道的矩阵图像 参数时classname为uint8
    img = np.zeros([400,400,3],np.uint8)
    # 第一个通道blue 所以展示的是蓝色
    img[:,:,0] = np.ones([400,400])*255#ones([400, 400])是创建一个400*400的全1矩阵,*255即是全255矩阵 并将这个矩阵的值赋给img的第一维
    # 第二个通道green 所以展示的是绿色
    img[:,:,1] = np.ones([400,400])*255 # 第二维全是255
    # 第三个通道red 所以展示的是红色
    img[:,:,2] = np.ones([400,400])*255 # 第三维全是255

 # 此处是展示了三通道合并后的图片,也就是白色,若想展示第一通道的蓝色,则应将第二三通道的代码注释
    cv.imshow("new image",img)# #输出一张400*400的白色图片(255 255 255):蓝(B)、绿(G)、红(R)

# numpy的操作实例

def numpy_demo():
    # 创建一个三行三列浮点型数组
    m1 = np.ones([3,3],np.float)
    # 将m1中的值全部用1222.454替换
    m1.fill(1222.454)
    print('三行三列浮点型数组',m1)
    # 将m1转化为一行九列
    m2 = m1.reshape([1,9])
    print("reshape函数转化为一行九列",m2)

# 像素取反
def inverse(image):
    dst = cv.bitwise_not(image)
    cv.imshow("inverse",dst)


if __name__ == "__main__":
    '''
    调用函数access_pixles()部分代码
    '''
    # 读取图片
    src = cv.imread("pic/bizhi.jpg")
    # 创建窗口,用来显示图片
    # cv.WINDOW_NORMAL | namedWindow
    cv.namedWindow('input_image',cv.WINDOW_NORMAL)
    # 展示读取的图片
    cv.imshow('input_image',src)
    # 毫秒级别的计时函数,记录了系统启动以来的时间毫秒
    t1 = cv.getTickCount()
    # 调用函数
    print('调用函数 access_pixlex了')
    access_pixlex(src)
    t2 = cv.getTickCount()
    # getTickFrequency用于返回CPU的频率,就是每秒的计时周期数
    time = (t2-t1) * 1000 / cv.getTickFrequency()
    print('time :{}'.format(time))
    # waitkey窗口显示时间,毫秒,k=0,一直显示,键盘上按个数字键,就会消
    cv.waitKey(0)
    # 删除建立的全部窗口,释放资源
    cv.destroyAllWindows()


    '''
    调用函数create_image()部分代码
    '''
    # creat_image()
    # cv.waitKey(0)
    # cv.destroyAllWindows()

    '''
    调用函数numpy_demo()部分代码
    '''
    numpy_demo()

    '''
    调用库函数实现取反,这里access_pixles()实现的也是取反,
    但是使用库函数取反快很多
    '''
    # blue green red 三个通道
    # src = cv.imread("pic/bizhi.jpg")
    # t1 = cv.getTickCount()
    # inverse(src) # inverse取反库函数
    # t2 = cv.getTickCount()
    # time = (t2-t1)*1000/cv.getTickFrequency()
    # print('time:%s'%time)
    # cv.waitKey(0)
    # cv.destroyAllWindows()


posted @ 2021-08-11 17:51  索匣  阅读(192)  评论(0编辑  收藏  举报