cv(二)

1.cv读视频的时候会分析内容,然后对每一帧进行处理,cv并不是音视频的编码解码的工具,cv是要对读过来的内容进行对象检测,对象跟踪,音视频的编码解码是由ffmg来做的,所以cv读出来的视频是没有声音的,对视频大小是有一定限制的。

2.

 1 import cv2 as cv
 2 import numpy as np
 3 
 4 
 5 def access_pixels(image):
 6     print(image.shape)
 7     height = image.shape[0]  #
 8     width = image.shape[1]  #
 9     channels = image.shape[2]  # 通道数
10     print('widti: %s, height: %s, channels: %s' %(height, width, channels))
11     # 获取像素值
12     for row in range(height):
13         for col in range(width):
14             for c in range(channels):
15                 pv = image[row, col, c]
16                 image[row, col, c] = 255 - pv  # 图像反转
17     cv.imshow('pixels_demo', image)
18 
19 
20 def create_image():
21     img = np.zeros((400, 400, 3), np.uint8)  # 创建一张三通道图
22     img[:, :, 0] = np.ones((400, 400))*255  # 修改第一通道
23 
24     img2 = np.zeros((400, 400, 1), np.uint8)  # 创建单通道图像
25     img2[:, :, 0] = np.ones((400, 400))*127
26 
27     m1 = np.ones((3, 3), np.uint8)
28     m1.fill(12222.388)
29     print(m1)
30     m2 = m1.reshape((1, 9))  # 改变图像形状
31     print(m2)
32 
33     cv.imshow('new image', img)
34 
35 
36 def inverse(image):
37     dst = cv.bitwise_not(image)  # 像素取反,因为底层是c实现的,所以要比自己实现的access_pixels(src)要快很多
38     cv.imshow('inverse image', dst)
39 
40     n3 = np.array([[2, 3, 4], [4, 5, 6], [7, 8, 9]], np.int32)
41     n3.fill(9)
42     print(n3)
43 
44 print('--------Hello Python------------')
45 src = cv.imread('')  # 读图
46 t1 = cv.getTickCount()  # 获取当前cpu转的时钟圈数
47 access_pixels(src)
48 t2 = cv.getTickCount()  # 获取当前cpu转的时钟圈数
49 # 计算性能
50 time = (t2-t1)/cv.getTickFrequency()
51 print('time: %s ms'%(time * 1000))  # t2-t1:总圈数 (t2-t1)/cv.getTickFrequency():每秒的圈数
t2

3.色彩空间

 1 import cv2 as cv
 2 import numpy as np
 3 
 4 '''
 5 常见的色彩空间:RGB HSV HIS YCrCb(常用于皮肤特征提取) YUV
 6 HSV: H(0-100) S(0-255) V(0-255)
 7 '''
 8 # 色彩空间转换,从bgr到gray,hsv,yuv,ycrcb
 9 def color_space_demo(image):
10     gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
11     cv.imshow("gray", gray)
12 
13     hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
14     cv.imshow("hsv", hsv)
15 
16     yuv = cv.cvtColor(image, cv.COLOR_BGR2YUV)
17     cv.imshow("yuv", yuv)
18 
19     ycrcb = cv.cvtColor(image, cv.COLOR_BGR2YCrCb)
20     cv.imshow("ycrcb", ycrcb)
21 
22 
23 # 从视频中提取指定颜色范围,并将其置为白,其余置为黑
24 def extract_object_demo():
25     capture = cv.VideoCapture("cv.gif")
26     while True:
27         ret, frame = capture.read()
28 
29         if ret is False:  # 如果没有获取到视频帧则返回false
30             break
31         hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)  # 首先转换成hsv空间
32         # lower_hsv和upper_hsv是根据表查出来的,不是随便填的
33         lower_hsv = np.array([35, 43, 46])  # hsv中h,s,v的最小值
34         upper_hsv = np.array([77, 255, 255])  # hsv中的h,s,v最大值
35 
36         # 提取指定颜色区域,保留指定颜色区域, 其余置为黑(0)
37         mask = cv.inRange(hsv, lowerb=lower_hsv, upperb=upper_hsv)  # 用inRange函数提取指定颜色范围,这里对hsv来处理
38         cv.imshow("video", frame)
39         cv.imshow("mask", mask)
40 
41         c = cv.waitKey(40)
42         if c == 27:  # 27是esc键
43             break
44 
45 
46 # 对图片三个通道颜色提取并放在三张图片中
47 def channels_split_merge(image):
48     # 通道分离
49     b, g, r = cv.split(image)  # b或g或r通道取时,对该通道颜色保留,其余通道置为0
50     cv.imshow("blue", b)
51     cv.imshow("green", g)
52     cv.imshow("red", r)
53 
54     changed_image = image.copy()
55 
56     changed_image[:, :, 2] = 0  # 将r通道颜色全部置为0
57     cv.imshow("changed_image", changed_image)
58 
59     # 通道合并
60     merge_image = cv.merge([b, g, r])
61     cv.imshow("merge_image", merge_image)
62 
63 if __name__ == '__main__':
64 
65     src = cv.imread("../images/CrystalLiu1.jpg")  # 读入图片放进src中
66     cv.namedWindow("Crystal Liu", cv.WINDOW_AUTOSIZE)  # 创建窗口, 窗口尺寸自动调整
67     cv.imshow("Crystal Liu", src)  # 将src图片放入该创建的窗口中
68     # color_space_demo(src)
69     # extract_object_demo()
70     channels_split_merge(src)
71     cv.waitKey(0)
72     cv.destroyAllWindows()
t3

4.像素运算

 1 import cv2 as cv
 2 import numpy as np
 3 
 4 '''像素运算: 运算前需要保证两个图像大小必须一样
 5         算术运算:加减乘除,调节亮度,调节对比度
 6         逻辑运算:与或非'''
 7 
 8 def add_demo(m1, m2):
 9     #
10     dst = cv.add(m1, m2)
11     cv.imshow("add_demo", dst)
12 
13 
14 def subtract_demo(m1, m2):
15     #
16     dst = cv.subtract(m1, m2)
17     cv.imshow("subtract_demo", dst)
18 
19 
20 def divide_demo(m1, m2):
21     #
22     dst = cv.divide(m1, m2)
23     cv.imshow("divide_demo", dst)
24 
25 
26 def multiply_demo(m1, m2):
27     #
28     dst = cv.multiply(m1, m2)
29     cv.imshow("multiply_demo", dst)
30 
31 # 图像的逻辑运算,:AND,OR,NOT,XOR
32 def logic_demo(m1, m2):
33     dst1 = cv.bitwise_and(m1, m2)  # 与  dst = cv.bitwise_and(frame, frame, mask=mask)
34     dst2 = cv.bitwise_not(m1)  #
35     dst3 = cv.bitwise_or(m1, m2)  #
36     cv.imshow("logic_demo", dst1)
37 
38 # 调节亮度和对比度
39 def contrast_brightness_demo(image, c, b):
40     h, w, ch = image.shape
41     blank = np.zeros([h, w, ch], image.dtype)  # 创建一个空白图像
42 
43     # 图像混合,c:对比度, 1-c为这两张图片的权重 b:亮度
44     dst = cv.addWeighted(image, c, blank, 1-c, b)
45     cv.imshow("contrast_brightness_demo", dst)
46 
47 
48 # 对照片像素做均值方差
49 def others(m1, m2):
50     M1 = cv.mean(m1)  # 计算均值
51     M2 = cv.mean(m2)
52     print(M1)
53     print(M2)
54 
55     mean1, dev1 = cv.meanStdDev(m1)  # 返回均值和方差,通过方差可以判断除像素之间的差异性
56     print("均值:",mean1,"方差:", dev1)
57 
58 
59 if __name__ == '__main__':
60     print("----------Hello World!----------")
61     src1 = cv.imread("../images/01.jpg")
62     src2 = cv.imread("../images/02.jpg")
63     print(src1.shape)
64     print(src2.shape)
65 
66     cv.namedWindow("image1", cv.WINDOW_AUTOSIZE)  # 创建窗口, 窗口尺寸自动调整
67     cv.imshow("image1", src1)
68     cv.imshow("image2", src2)
69 
70     # add_demo(src1, src2)
71     # subtract_demo(src1, src2)
72     # divide_demo(src1, src2)
73     # multiply_demo(src1,src2)
74     # others(src1, src2)
75 
76     # logic_demo(src1, src2)
77     src = cv.imread("../images/CrystalLiu2.jpg")
78     contrast_brightness_demo(src,1.3, 80)
79     cv.waitKey(0)
80 
81     cv.destroyAllWindows()
像素运算

 

posted @ 2020-06-13 23:41  liang哥哥  阅读(147)  评论(0)    收藏  举报