一、读取一张图片,修改颜色通道后输出
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