• 四 numpy操作数组输出图片


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

     1 # -*- coding=GBK -*-
     2 import cv2 as cv
     3 import numpy as np
     4  
     5  
     6 #numpy数组操作
     7 def access_pixles(image):
     8     print(image.shape)
     9     height = image.shape[0]
    10     width = image.shape[1]
    11     channel = image.shape[2]
    12     print("width : %s, height : %s, channel : %s" % (width, height, channel))
    13     for row in range(height):
    14         for col in range(width):
    15             for c in range(channel):
    16                 pv = image[row, col, c]
    17                 image[row, col, c] = 255 - pv
    18     cv.imshow("修改后", image)
    19  
    20  
    21 src = cv.imread("C://1.jpg")
    22 #cv.namedWindow("原来", cv.WINDOW_NORMAL)
    23 cv.imshow("原来", src)
    24 t1 = cv.getTickCount()#毫秒级别的计时函数,记录了系统启动以来的时间毫秒
    25 access_pixles(src)
    26 t2 = cv.getTickCount()
    27 time = (t2 - t1)*1000/cv.getTickFrequency()#getTickFrequency用于返回CPU的频率,就是每秒的计时周期数
    28 print("time: %s" % time)#输出运行的时间
    29 cv.waitKey(0)
    30 cv.destroyAllWindows()

    说明:

    getTickCount()/getTickFrequency()

    getTickCount():用于返回从操作系统启动到当前所经的计时周期数,看名字也很好理解,get Tick Count(s)。
    getTickFrequency():用于返回CPU的频率。get Tick Frequency。这里的单位是秒,也就是一秒内重复的次数。

    所以剩下的就很清晰了:
    总次数/一秒内重复的次数 = 时间(s)
    1000 *总次数/一秒内重复的次数= 时间(ms)

    C++版的getTickFrequency返回的是每秒钟的tick数

    C版的cvGetTickFrequency返回的是每微妙的tick数
    这个逻辑很清晰,没什么问题,但是这里有一个小坑,那就是C版本的cvGetTickFrequency()函数和C++版本的getTickFrequency()的单位不一样,前者以ms计算频率,后者以s为单位计算频率,所以如果使用C版本的cvGetTickFrequency()计算时间的话,应该是:
    总次数/(一us内重复的次数*1000) = 时间(ms)
    总次数/(一us内重复的次数*1000000) = 时间(s)

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

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

    运行结果是输出一张白色图片  也可修改255为其他数字来输出不同颜色的图片

    也可单独使用ones函数,代码如下:

     1 # -*- coding=GBK -*-
     2 import cv2 as cv
     3 import numpy as np
     4  
     5  
     6 def create_image():
     7     img = np.ones([400, 400, 3], np.uint8)
     8     img[:, :, 0] = img[:, :, 0]*255
     9     img[:, :, 1] = img[:, :, 1]*255
    10     img[:, :, 2] = img[:, :, 2]*255
    11     cv.imshow("自制图片", img)
    12  
    13 create_image()
    14 cv.waitKey(0)
    15 cv.destroyAllWindows()

    三、自定义一张单通道图片

    # -*- coding=GBK -*-
    import cv2 as cv
    import numpy as np
     
     
    def create_image():
        img = np.ones([400, 400, 1], np.uint8)
        img = img * 127
        cv.imshow("自制图片", img)
     
    create_image()
    cv.waitKey(0)
    cv.destroyAllWindows()

    四、调用库函数来实现像素反转

    # -*- 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_and是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0
    bitwise_or是对二进制数据进行“或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“或”操作,1|1=1,1|0=0,0|1=0,0|0=0
    bitwise_xor是对二进制数据进行“异或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“异或”操作,1^1=0,1^0=1,0^1=1,0^0=0
    bitwise_not是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,~1=0,~0=1

  • 相关阅读:
    PMP:9.项目资源管理
    @JsonIgnore忽略JSON字段
    xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
    android加载不到.so文件
    报错Failed to install the following SDK components: platforms;android-29 Android SDK Platform 29
    Mac 终端启动运行Redis
    Mac 命令行执行Sublime
    Bean转为Json指定字段名,防止被修改大小写
    Rest接口入参忽略大小写 使用jackson注解
    mongo批量导入
  • 原文地址:https://www.cnblogs.com/pacino12134/p/9839516.html
Copyright © 2020-2023  润新知