OpenCV 基础_01

Posted zach0812

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV 基础_01相关的知识,希望对你有一定的参考价值。

第一章:基础操作:

openCV画图:

技术图片
 1 from imutils import *   #这是封装到一个模块imutils
 2 
 3 image = np.zeros((300,300,3),dtype=uint8)
 4 # show(image)  #它是个黑色的图片
 5 
 6 #画线
 7 if 0:
 8     red = (255,0,0)
 9     cv2.line(image,(0,0),(300,300),red)
10     # show(image)
11 
12     blue = (0,0,255)
13     cv2.line(image,(300,0),(150,150),blue,5) #最后一个参数为线的宽度
14     show(image)
15     pass
16 
17 #画矩形
18 if 0:
19     red = (255,0,0)
20     cv2.rectangle(image,(10,10),(100,100),red,2) #最后一个参数为线宽(注:如果最后一个参数为-1 ,则是填充)
21     show(image)
22     pass
23 
24 #画圆
25 if 1:
26     if 0:
27         image = np.zeros((300,300,3),dtype=uint8)#它是个黑色的图片
28         cx,cy = image.shape[1]//2,image.shape[0]//2
29         white = (255,255,255)
30         for i in range(0,151,15):
31             cv2.circle(image,(cx,cy),i,white)
32         show(image)
33         pass
34 
35     if 0:
36         image = np.zeros((300,300,3),dtype=uint8)
37         cx,cy = image.shape[1]//2 ,image.shape[0]//2
38         #随机画十个圆
39         for _ in range(10):
40             radius  = np.random.randint(5,151)
41             #颜色
42             color = np.random.randint(0,256,size=(3,)).tolist()
43             cv2.circle(image,(cx,cy),radius,color)
44         show(image)
45         pass
46     if 1:
47         image = np.zeros((300,300,3),dtype=uint8)
48         #随机画十个圆 (圆心也不固定,而且填充圆)
49         for _ in range(20):
50             radius  = np.random.randint(5,151)
51             #颜色
52             color = np.random.randint(0,256,size=(3,)).tolist()
53             #圆心
54             point = np.random.randint(0,300,size=(2,))
55 
56             cv2.circle(image,tuple(point),radius,color,-1)
57 
58         show(image)
59         pass
60     pass
View Code
技术图片
 1 #成批自动绘制图片 并保存到本地
 2 for i in range(10):
 3     #画圆
 4     image = np.zeros((300,300,3),dtype=uint8)
 5     #随机画十个圆 (圆心也不固定,而且填充圆)
 6     for _ in range(30):
 7         radius  = np.random.randint(5,151)
 8         #颜色
 9         color = np.random.randint(0,256,size=(3,)).tolist()
10         #圆心
11         point = np.random.randint(0,300,size=(2,))
12         cv2.circle(image,tuple(point),radius,color,-1)
13 
14     show(image)
15     cv2.imwrite("d:/images/circle_.png".format(i),image)
自动生成图片

 

第二章:几何变换:

翻转:

它主要有三种:水平 ,垂直 和 水平+垂直

函数是 cv2.flip(src,flipCode)

其中的flipCode取值为  0 1 ,-1 

0 是 垂直翻转 ,1 是水平翻转      -1 是水平加垂直

 

技术图片
 1 from imutils import *
 2 
 3 image = imread("d:/images/test.jpg")
 4 # show(image)
 5 
 6 #水平翻转
 7 if 0:
 8     image = cv2.flip(image,1)
 9     show(image)
10 
11 
12 #垂直翻转
13 if 0:
14     image = cv2.flip(image,0)   # 0 表示垂直翻转
15     show(image)
16 
17 #水平+ 垂直 翻转
18 if 1:
19     image = cv2.flip(image,-1) # 水平加垂直
20     show(image)
View Code

 

 

裁剪:

技术图片
1 from imutils import *
2 
3 image = imread("d:/images/test.jpg")
4 #对图片进行裁剪
5 image = image[:200,50:200]  #裁剪
6 show(image)
View Code

图像算术(图像的加减法):

 

技术图片
 1 from imutils import *
 2 
 3 image = imread("d:/images/test.jpg")
 4 
 5 #图像加法
 6 if 0:
 7     # print(np.uint8([200]))
 8     #图像加法
 9     res = cv2.add(np.uint8([200]),np.uint8([100]))
10     print(res)  #最大是255
11 
12     #普通加法
13     res = np.uint8([200]) +np.uint8([100])
14     print(res)  #44  此时已经溢位
15 
16     pass
17 
18 #图像减法
19 if 0:
20     #图像减法
21     res = cv2.subtract(np.uint8([50]),np.uint8([100]))
22     print(res)  #最小是0
23 
24     #普通减法
25     res = np.uint8([50]) -np.uint8([100])
26     print(res)  #[206] 此时已经溢位
27 
28     pass
29 
30 
31 #给图片的每个像素都加100
32 if 1:
33     #生成和 image 一样的数据
34     M = np.ones(image.shape,dtype=uint8)*100
35 
36     #给image 的像素值都家加上100
37     image_new = cv2.add(image,M)
38     show(image_new)  #可以观察到图片变白了,因为加上值,所以整体数值偏大
39     pass
40 
41 #给图片的每个像素都减100
42 if 1:
43     #生成和 image 一样的数据
44     M = np.ones(image.shape,dtype=uint8)*100
45 
46     #给image 的像素值都家减去100
47     image_new = cv2.subtract(image,M)
48     show(image_new)  #可以观察到图片变黑了,因为整体数值偏像0
49     pass
View Code

 

按位计算:

四种常见的按位计算:

与  或  非  异或

其中的异或是:当两个数相同时为0 ,不同时为1

技术图片
 1 from imutils import *
 2 
 3 image1 = np.zeros((300,300,3),dtype=uint8)
 4 
 5 #画个白色的矩形
 6 white = (255,255,255)
 7 cv2.rectangle(image1,(25,25),(275,275),white,-1) #填充
 8 # show(image1) #矩形
 9 
10 image2 = np.zeros(image1.shape,dtype=uint8)
11 cv2.circle(image2,(150,150),150,white,-1)
12 # show(image2)  #圆
13 if 1:
14     # 与 有黑就变黑    0是黑 1 是白
15     image3 =cv2.bitwise_and(image1,image2)
16     # show(image3)
17 
18     # 或  有白就变白    0是黑 1 是白
19     image4 =cv2.bitwise_or(image1,image2)
20     # show(image4)
21 
22     # 非  黑白交换
23     image5 =cv2.bitwise_not(image1)
24     image6 =cv2.bitwise_not(image2)
25     # show(image5)
26     # show(image6)
27 
28 
29     # 异或  相同为0 相同为黑 ,不同为白
30     image7 = cv2.bitwise_xor(image1,image2)
31     # show(image7)
View Code

 

遮挡:

利按位计算来进行遮挡 。

技术图片
 1 from imutils import *
 2 
 3 image = imread("d:/images/test.jpg")
 4 
 5 # show(image)
 6 if 0:
 7     #创建矩形遮挡
 8     mask = np.zeros(image.shape,dtype=uint8)
 9     cv2.rectangle(mask,(50,50),(250,350),(255,255,255),-1)
10     # show(mask)
11 
12     #对图片进行遮挡  #有黑 必有黑
13     image_new = cv2.bitwise_and(image,mask)
14     show(image_new)
15     pass
16 if 1:
17     #创建圆形遮挡
18     mask = np.zeros(image.shape,dtype=uint8)
19     cv2.circle(mask,(150,150),100,(255,255,255),-1)
20     show(mask)
21 
22     # 对图片进行遮挡  #有黑 必有黑
23     image_new = cv2.bitwise_and(image,mask)
24     show(image_new)
25 
26     pass
View Code

切分合并通道:

技术图片
 1 from imutils import *
 2 
 3 image = imread("d:/images/test.jpg")
 4 
 5 #切分颜色通道
 6 R,G,B = cv2.split(image)
 7 
 8 #用openCV 自己的imshow()显示R  G  B 
 9 cv2.imshow(R,R)  #它们都是黑白图片因为它们都是单通道的图片
10 cv2.imshow(G,G)
11 cv2.imshow(B,B)
12 cv2.waitKey(0)
13 cv2.destroyAllWindows()
14 
15 print(R.shape)
16 print(G.shape)
17 print(B.shape)
18 
19 #合并颜色通道
20 image = cv2.merge([R,G,B])
21 # show(image)
View Code

 

 

图像金字塔:

它不是一种具体的算法,而是一种处理图片的思想,

技术图片

 

技术图片

 

技术图片
 1 from imutils import *
 2 
 3 image = imread("d:/images/image.jpg")
 4 # print(image.shape) #原始图片大小 (424, 600, 3)
 5 # show(image)
 6 
 7 #进行高斯金字塔 降低分辨率  #和resize 其实是差不多的,
 8 if 0:
 9     for i in range(4):
10         image = cv2.pyrDown(image)
11         print(image.shape)
12         show(image)
13     ‘‘‘
14     输出:
15     (212, 300, 3)
16     (106, 150, 3)
17     (53, 75, 3)
18     (27, 38, 3)
19     四个图片变得越来越模糊 
20     ‘‘‘
21     pass
22 
23 #进行高斯金字塔 提高分辨率
24 if 0:
25     for i in range(4):
26         image = cv2.pyrUp(image)
27         print(image.shape)
28         show(image)
29         pass
30     ‘‘‘
31     输出
32     (848, 1200, 3)
33     (1696, 2400, 3)
34     (3392, 4800, 3)
35     (6784, 9600, 3)
36     ‘‘‘
37 
38     pass
39 
40 #拉普拉斯金字塔  它主要是用来提取物体的边界轮廓
41 if 1:
42     down_image1 = cv2.pyrDown(image)
43     down_image2 = cv2.pyrDown(down_image1) #两次高斯金字塔
44 
45     up_image = cv2.pyrUp(down_image2)
46     lp  = down_image1 -up_image
47     show(lp)
48     #上面相当于做了一次拉普拉斯金字塔
49     pass
高斯金字塔和拉普拉斯金字塔

 

 

第三章:形态学:

卷积的简单介绍:

技术图片

Erosion腐蚀(消除白点)

其原理是在原图的小区域内取局部最小值,其函数是cv2.erode()。这个核也叫结构元素,因为形态学操作其实也是应用卷积来实现的,结构元素可以是矩形/椭圆/十字形,可以用cv2.getStructuringElement()来生成不同形状的结构元素,比如:

腐蚀黑色的会变多

技术图片
 1 from imutils import *
 2 
 3 #使用cv2.getStructuringElement生成不同形状的结构元素
 4 #矩形
 5 kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5)) #morph 是变形的意思
 6 
 7 #椭圆
 8 kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
 9 
10 #十字形
11 kernel3 = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
12 
13 image = imread("d:/images/image.jpg")
14 # show(image)
15 
16 
17 #使用 cv2.erode() 来对图片进行腐蚀
18 if 0:
19     image_new1 = cv2.erode(image,kernel1) #用矩形核 来进行腐蚀
20     show(image_new1)
21 
22     pass
23 
24 if 1:
25     #多次腐蚀
26     for i in range(3):
27         image_new1 =cv2.erode(image,kernel1,iterations=i+1) #第一次腐蚀1次,第二次腐蚀2次,第三次腐蚀3次
28         show(image_new1)
29     pass
30 
31 
32 
33 # image_new2 = cv2.erode(image,kernel2)
34 # show(image_new2)
35 #
36 # image_new3 = cv2.erode(image,kernel3)
37 # show(image_new3)
View Code

 

膨胀白色的会变多

技术图片
 1 from imutils import *
 2 
 3 #使用cv2.getStructuringElement生成不同形状的结构元素
 4 #矩形
 5 kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5)) #morph 是变形的意思
 6 
 7 #椭圆
 8 kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
 9 
10 #十字形
11 kernel3 = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
12 
13 image = imread("d:/images/image.jpg")
14 # show(image)
15 
16 
17 #使用 cv2.dilate() 来对图片进行腐蚀
18 if 1:
19     image_new1 = cv2.dilate(image,kernel1) #用矩形核 来进行腐蚀
20     show(image_new1)
21     pass
View Code

膨胀和腐蚀的区别就是函数不同!

 

技术图片
 1 from imutils import *
 2 
 3 #使用cv2.getStructuringElement生成不同形状的结构元素
 4 #矩形
 5 kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5)) #morph 是变形的意思
 6 
 7 #椭圆
 8 kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
 9 
10 #十字形
11 kernel3 = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
12 
13 image = imread("d:/images/image2.jpg")
14 show(image)
15 
16 #使用 cv2.morphologyEx()进行开运算(morph_open) 和 闭运算(morph_close)
17 image_new = cv2.morphologyEx(image,cv2.MORPH_CLOSE,kernel1)
18 show(image_new) #发现黑点消失了
View Code

 

先做开运算再做闭运算:(先去除白点,再去除黑点)

技术图片
 1 from imutils import *
 2 
 3 #使用cv2.getStructuringElement生成不同形状的结构元素
 4 #矩形
 5 kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5)) #morph 是变形的意思
 6 
 7 #椭圆
 8 kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
 9 
10 #十字形
11 kernel3 = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
12 
13 image = imread("d:/images/image2.jpg")
14 show(image)
15 
16 #使用 cv2.morphologyEx()进行开运算(morph_open) 和 闭运算(morph_close)
17 image_opening = cv2.morphologyEx(image,cv2.MORPH_OPEN,kernel1)
18 image_closing = cv2.morphologyEx(image_opening,cv2.MORPH_CLOSE,kernel1)
19 show(image_closing)
View Code

但是,它们带来的影响是图片相较原图,会变得模糊一些!!!

 

 

 

以上是关于OpenCV 基础_01的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV基础操作_视频读取

opencv基础OpenCV使用Viz模块3D可视化显示

车牌识别01__车牌抠图(CNN深度学习—opencv实现方法)

2022-05-01 python opencv 读取图片返回None

OpenCV基础---图形绘制

基于opencv 手识识别基础