四 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

原文地址:https://www.cnblogs.com/pacino12134/p/9839516.html