Skip to content

Commit 8d6ffac

Browse files
CodecWanggitbook-bot
authored andcommitted
GitBook: [master] 33 pages modified
1 parent 24ec9ec commit 8d6ffac

33 files changed

+4601
-179
lines changed

README.md

Lines changed: 46 additions & 179 deletions
Original file line numberDiff line numberDiff line change
@@ -1,184 +1,51 @@
1-
# OpenCV-Python Tutorial for Beginners
2-
3-
---
1+
# 目录
42

53
![](http://blog.codec.wang/opencv-python-tutorial-amend-new-cover.png)
64

7-
- Blog: http://codec.wang
8-
- Github中MathJax的公示显示有误,可到[Blog](http://codec.wang/opencv-python)查看。
9-
- [OpenCV-Python 3.x旧版教程](https://github.com/CodecWang/OpenCV-Python-Tutorial/tree/3.x)
5+
* 博客: [http://opencv.codec.wang](http://codec.wang)
6+
7+
### 入门篇
8+
9+
| 标题 | 简介 |
10+
| :--- | :--- |
11+
| [简介与安装](01-Introduction-and-Installation) | 了解和安装OpenCV-Python |
12+
| [番外篇: 代码性能优化](Extra-01-Code-Optimization) | 度量运行时间/提升效率的几种方式 |
13+
| [基本元素: 图片](02-Basic-Element-Image) | 图片的载入/显示和保存 |
14+
| [番外篇: 无损保存和Matplotlib使用](Extra-02-High-Quality-Save-and-Matplotlib) | 高保真保存图片、Matplotlib库的简单使用 |
15+
| [打开摄像头](03-Open-Camera) | 打开摄像头捕获图片/录制视频/播放本地视频 |
16+
| [番外篇: 滑动条](Extra-03-Trackbar) | 滑动条的使用 |
17+
| [图像基本操作](04-Basic-Operations) | 访问像素点/ROI/通道分离合并/图片属性 |
18+
| [颜色空间转换](05-Changing-Colorspaces) | 颜色空间转换/追踪特定颜色物体 |
19+
| [阈值分割](06-Image-Thresholding) | 阈值分割/二值化 |
20+
| [番外篇: Otsu阈值法](Extra-04-Otsu-Thresholding) | 双峰图片/Otsu自动阈值法 |
21+
| [图像几何变换](07-Image-Geometric-Transformation) | 旋转/平移/缩放/翻转 |
22+
| [番外篇: 仿射变换与透视变换](Extra-05-Warpaffine-Warpperspective) | 基于2×3的仿射变换/基于3×3的透视变换 |
23+
| [绘图功能](08-Drawing-Function) | 画线/画圆/画矩形/添加文字 |
24+
| [番外篇: 鼠标绘图](Extra-06-Drawing-with-Mouse) | 用鼠标实时绘图 |
25+
| [挑战篇: 画动态时钟](Challenge-01-Draw-Dynamic-Clock) | / |
26+
| [挑战篇: PyQt5编写GUI界面](Challenge-02-Create-GUI-with-PyQt5) | / |
27+
28+
### 基础篇
29+
30+
| 标题 | 简介 |
31+
| :--- | :--- |
32+
| [图像混合](09-Image-Blending) | 算数运算/混合/按位运算 |
33+
| [番外篇: 亮度与对比度](Extra-07-Contrast-and-Brightness) | 调整图片的亮度和对比度 |
34+
| [平滑图像](10-Smoothing-Images) | 卷积/滤波/模糊/降噪 |
35+
| [番外篇: 卷积基础-图片边框](Extra-08-Padding-and-Convolution) | 了解卷积/滤波的基础知识/给图片添加边框 |
36+
| [边缘检测](11-Edge-Detection) | Canny/Sobel算子 |
37+
| [番外篇: 图像梯度](Extra-09-Image-Gradients) | 了解图像梯度和边缘检测的相关概念 |
38+
| [腐蚀与膨胀](12-Erode-and-Dilate) | 形态学操作/腐蚀/膨胀/开运算/闭运算 |
39+
| [轮廓](13-Contours) | 寻找/绘制轮廓 |
40+
| [番外篇: 轮廓层级](Extra-10-Contours-Hierarchy) | 了解轮廓间的层级关系 |
41+
| [轮廓特征](14-Contour-Features) | 面积/周长/最小外接矩\(\)/形状匹配 |
42+
| [番外篇: 凸包及更多轮廓特征](Extra-11-Convex-Hull) | 计算凸包/了解更多轮廓特征 |
43+
| [直方图](15-Histograms) | 计算绘制直方图/均衡化 |
44+
| [模板匹配](16-Template-Matching) | 图中找小图 |
45+
| [霍夫变换](17-Hough-Transform) | 提取直线/圆 |
46+
| [挑战任务: 车道检测](Challenge-03-Lane-Road-Detection) | / |
47+
48+
> 如果您觉得写的不错的话,欢迎打赏,我会写出更好的内容!✊
1049
11-
## :book:Content
50+
!\[\]\([https://blog.codec.wang/opencv-python-tutorial-amend-new-cover.png](https://blog.codec.wang/opencv-python-tutorial-amend-new-cover.png)\)
1251

13-
<table>
14-
<thead>
15-
<tr>
16-
<th>序号</th>
17-
<th>标题</th>
18-
<th>内容简介</th>
19-
</tr>
20-
</thead>
21-
<tbody>
22-
<tr>
23-
<td colspan='3'><h4>:boom:入门篇</h4></td>
24-
</tr>
25-
<tr>
26-
<td>01</td>
27-
<td><a href="01-Introduction-and-Installation">简介与安装<br/>Introduction and Installation</a></td>
28-
<td>了解和安装OpenCV-Python</td>
29-
</tr>
30-
<tr>
31-
<td>02</td>
32-
<td><a href="Extra-01-Code-Optimization">番外篇: 代码性能优化<br/>Code Optimization</a></td>
33-
<td>度量运行时间/提升效率的几种方式</td>
34-
</tr>
35-
<tr>
36-
<td>03</td>
37-
<td><a href="02-Basic-Element-Image">基本元素: 图片<br/>Basic Element: Image</a></td>
38-
<td>图片的载入/显示和保存</td>
39-
</tr>
40-
<tr>
41-
<td>04</td>
42-
<td><a href="Extra-02-High-Quality-Save-and-Matplotlib">番外篇: 无损保存和Matplotlib使用<br/>High Quality Save and Matplotlib</a></td>
43-
<td>高保真保存图片、Matplotlib库的简单使用</td>
44-
</tr>
45-
<tr>
46-
<td>05</td>
47-
<td><a href="03-Open-Camera">打开摄像头<br/>Open Camera</a></td>
48-
<td>打开摄像头捕获图片/录制视频/播放本地视频</td>
49-
</tr>
50-
<tr>
51-
<td>06</td>
52-
<td><a href="Extra-03-Trackbar">番外篇: 滑动条<br/>Trackbar</a></td>
53-
<td>滑动条的使用</td>
54-
</tr>
55-
<tr>
56-
<td>07</td>
57-
<td><a href="04-Basic-Operations">图像基本操作<br/>Basic Operations</a></td>
58-
<td>访问像素点/ROI/通道分离合并/图片属性</td>
59-
</tr>
60-
<tr>
61-
<td>08</td>
62-
<td><a href="05-Changing-Colorspaces">颜色空间转换<br/>Changing Colorspaces</a></td>
63-
<td>颜色空间转换/追踪特定颜色物体</td>
64-
</tr>
65-
<tr>
66-
<td>09</td>
67-
<td><a href="06-Image-Thresholding">阈值分割<br/>Image Thresholding</a></td>
68-
<td>阈值分割/二值化</td>
69-
</tr>
70-
<tr>
71-
<td>10</td>
72-
<td><a href="Extra-04-Otsu-Thresholding">番外篇: Otsu阈值法<br/>Otsu Thresholding</a></td>
73-
<td>双峰图片/Otsu自动阈值法</td>
74-
</tr>
75-
<tr>
76-
<td>11</td>
77-
<td><a href="07-Image-Geometric-Transformation">图像几何变换<br/>Image Geometric Transformation</a></td>
78-
<td>旋转/平移/缩放/翻转</td>
79-
</tr>
80-
<tr>
81-
<td>12</td>
82-
<td><a href="Extra-05-Warpaffine-Warpperspective">番外篇: 仿射变换与透视变换<br/>Warpaffine Warpperspective</a></td>
83-
<td>基于2×3的仿射变换/基于3×3的透视变换</td>
84-
</tr>
85-
<tr>
86-
<td>13</td>
87-
<td><a href="08-Drawing-Function">绘图功能<br/>Drawing Function</a></td>
88-
<td>画线/画圆/画矩形/添加文字</td>
89-
</tr>
90-
<tr>
91-
<td>14</td>
92-
<td><a href="Extra-06-Drawing-with-Mouse">番外篇: 鼠标绘图<br/>Drawing with Mouse</a></td>
93-
<td>用鼠标实时绘图</td>
94-
</tr>
95-
<tr>
96-
<td>15</td>
97-
<td><a href="Challenge-01-Draw-Dynamic-Clock">挑战篇: 画动态时钟<br/>Draw Dynamic Clock</a></td>
98-
<td>/</td>
99-
</tr>
100-
<tr>
101-
<td>16</td>
102-
<td><a href="Challenge-02-Create-GUI-with-PyQt5">挑战篇: PyQt5编写GUI界面<br/>Create GUI with PyQt5</a></td>
103-
<td>/</td>
104-
</tr>
105-
<tr>
106-
<td colspan='3'><h4>:fire:基础篇</h4></td>
107-
</tr>
108-
<tr>
109-
<td>17</td>
110-
<td><a href="09-Image-Blending">图像混合<br/>Image Blending</a></td>
111-
<td>算数运算/混合/按位运算</td>
112-
</tr>
113-
<tr>
114-
<td>18</td>
115-
<td><a href="Extra-07-Contrast-and-Brightness">番外篇: 亮度与对比度<br/>Contrast and Brightness</a></td>
116-
<td>调整图片的亮度和对比度</td>
117-
</tr>
118-
<tr>
119-
<td>19</td>
120-
<td><a href="10-Smoothing-Images">平滑图像<br/>Smoothing Images</a></td>
121-
<td>卷积/滤波/模糊/降噪</td>
122-
</tr>
123-
<tr>
124-
<td>20</td>
125-
<td><a href="Extra-08-Padding-and-Convolution">番外篇: 卷积基础-图片边框<br/>Padding and Convolution</a></td>
126-
<td>了解卷积/滤波的基础知识/给图片添加边框</td>
127-
</tr>
128-
<tr>
129-
<td>21</td>
130-
<td><a href="11-Edge-Detection">边缘检测<br/>Edge Detection</a></td>
131-
<td>Canny/Sobel</td>
132-
</tr>
133-
<tr>
134-
<td>22</td>
135-
<td><a href="Extra-09-Image-Gradients">番外篇: 图像梯度<br/>Image Gradients</a></td>
136-
<td>了解图像梯度和边缘检测的相关概念</td>
137-
</tr>
138-
<tr>
139-
<td>23</td>
140-
<td><a href="12-Erode-and-Dilate">腐蚀与膨胀<br/>Erode and Dilate</a></td>
141-
<td>形态学操作/腐蚀/膨胀/开运算/闭运算</td>
142-
</tr>
143-
<tr>
144-
<td>24</td>
145-
<td><a href="13-Contours">轮廓<br/>Contours</a></td>
146-
<td>寻找/绘制轮廓</td>
147-
</tr>
148-
<tr>
149-
<td>25</td>
150-
<td><a href="Extra-10-Contours-Hierarchy">番外篇: 轮廓层级<br/>Contours Hierarchy</a></td>
151-
<td>了解轮廓间的层级关系</td>
152-
</tr>
153-
<tr>
154-
<td>26</td>
155-
<td><a href="14-Contour-Features">轮廓特征<br/>Contour Features</a></td>
156-
<td>面积/周长/最小外接矩(圆)/形状匹配</td>
157-
</tr>
158-
<tr>
159-
<td>27</td>
160-
<td><a href="Extra-11-Convex-Hull">番外篇: 凸包及更多轮廓特征<br/>Convex Hull</a></td>
161-
<td>计算凸包/了解更多轮廓特征</td>
162-
</tr>
163-
<tr>
164-
<td>28</td>
165-
<td><a href="15-Histograms">直方图<br/>Histograms</a></td>
166-
<td>计算绘制直方图/均衡化</td>
167-
</tr>
168-
<tr>
169-
<td>29</td>
170-
<td><a href="16-Template-Matching">模板匹配<br/></a></td>
171-
<td>大图中找小图</td>
172-
</tr>
173-
<tr>
174-
<td>30</td>
175-
<td><a href="17-Hough-Transform">霍夫变换<br/>Hough Transform</a></td>
176-
<td>提取直线/圆</td>
177-
</tr>
178-
<tr>
179-
<td>31</td>
180-
<td><a href="Challenge-03-Lane-Road-Detection">挑战任务: 车道检测<br/>Lane Road Detection</a></td>
181-
<td>/</td>
182-
</tr>
183-
</tbody>
184-
</table>

SUMMARY.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Table of contents
2+
3+
* [目录](README.md)
4+
5+
## 入门篇 <a id="start"></a>
6+
7+
* [01: 简介与安装](start/01-introduction-and-installation.md)
8+
* [02: 基本元素: 图片](start/02-basic-element-image.md)
9+
* [03: 打开摄像头](start/03-open-camera.md)
10+
* [04: 图像基本操作](start/04-basic-operations.md)
11+
* [05: 颜色空间转换](start/05-changing-colorspaces.md)
12+
* [06: 阈值分割](start/06-image-thresholding.md)
13+
* [07: 图像几何变换](start/07-image-geometric-transformation.md)
14+
* [08: 绘图功能](start/08-drawing-function.md)
15+
* [番外篇: 代码性能优化](start/extra-01-code-optimization.md)
16+
* [番外篇: 无损保存和Matplotlib](start/extra-02-high-quality-save-and-matplotlib.md)
17+
* [番外篇: 滑动条](start/extra-03-trackbar.md)
18+
* [番外篇: Otsu阈值法](start/extra-04-otsu-thresholding.md)
19+
* [番外篇: 仿射变换与透视变换](start/extra-05-warpaffine-warpperspective.md)
20+
* [番外篇: 鼠标绘图](start/extra-06-drawing-with-mouse.md)
21+
* [挑战任务: 画动态时钟](start/challenge-01-draw-dynamic-clock.md)
22+
* [挑战任务: PyQt5编写GUI界面](start/challenge-02-create-gui-with-pyqt5.md)
23+
24+
## 基础篇 <a id="basic"></a>
25+
26+
* [09: 图像混合](basic/09-image-blending.md)
27+
* [10: 平滑图像](basic/10-smoothing-images.md)
28+
* [11: 边缘检测](basic/11-edge-detection.md)
29+
* [12: 腐蚀与膨胀](basic/12-erode-and-dilate.md)
30+
* [13: 轮廓](basic/13-contours.md)
31+
* [14: 轮廓特征](basic/14-contour-features.md)
32+
* [15: 直方图](basic/15-histograms.md)
33+
* [16: 模板匹配](basic/16-template-matching.md)
34+
* [17: 霍夫变换](basic/17-hough-transform.md)
35+
* [番外篇: 亮度与对比度](basic/extra-07-contrast-and-brightness.md)
36+
* [番外篇: 卷积基础-图片边框](basic/extra-08-padding-and-convolution.md)
37+
* [番外篇: 图像梯度](basic/extra-09-image-gradients.md)
38+
* [番外篇: 轮廓层级](basic/extra-10-contours-hierarchy.md)
39+
* [番外篇: 凸包及更多轮廓特征](basic/extra-11-convex-hull.md)
40+
* [挑战任务: 车道检测](basic/challenge-03-lane-road-detection.md)
41+

basic/09-image-blending.md

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# 09: 图像混合
2+
3+
![](http://blog.codec.wang/cv2_image_blending_6_4.jpg)
4+
5+
学习图片间的数学运算,图像混合。图片等可到[源码处]()下载。
6+
7+
## 目标
8+
9+
* 图片间的数学运算,如相加、按位运算等
10+
* OpenCV函数:`cv2.add()`, `cv2.addWeighted()`, `cv2.bitwise_and()`
11+
12+
## 教程
13+
14+
> 首先恭喜你已经完成了入门篇的学习噢,接下来我们学习一些OpenCV的基础内容,加油\(ง •\_\)
15+
16+
### 图片相加
17+
18+
要叠加两张图片,可以用`cv2.add()`函数,相加两幅图片的形状(高度/宽度/通道数)必须相同。numpy中可以直接用res = img + img1相加,但这两者的结果并不相同:
19+
20+
```python
21+
x = np.uint8([250])
22+
y = np.uint8([10])
23+
print(cv2.add(x, y)) # 250+10 = 260 => 255
24+
print(x + y) # 250+10 = 260 % 256 = 4
25+
```
26+
27+
如果是二值化图片(只有0和255两种值),两者结果是一样的(用numpy的方式更简便一些)。
28+
29+
### 图像混合
30+
31+
图像混合`cv2.addWeighted()`也是一种图片相加的操作,只不过两幅图片的权重不一样,γ相当于一个修正值:
32+
33+
$$
34+
dst = \alpha\times img1+\beta\times img2 + \gamma
35+
$$
36+
37+
```python
38+
img1 = cv2.imread('lena_small.jpg')
39+
img2 = cv2.imread('opencv-logo-white.png')
40+
res = cv2.addWeighted(img1, 0.6, img2, 0.4, 0)
41+
```
42+
43+
![&#x56FE;&#x50CF;&#x6DF7;&#x5408;](http://blog.codec.wang/cv2_image_blending_6_4.jpg)
44+
45+
> 经验之谈:α和β都等于1时,就相当于图片相加。
46+
47+
### 按位操作
48+
49+
按位操作包括按位与/或/非/异或操作,有什么用途呢?比如说我们要实现下图的效果:
50+
51+
![](http://blog.codec.wang/cv2_bitwise_operations_demo.jpg)
52+
53+
如果将两幅图片直接相加会改变图片的颜色,如果用图像混合,则会改变图片的透明度,所以我们需要用按位操作。首先来了解一下[掩膜](https://baike.baidu.com/item/%E6%8E%A9%E8%86%9C/8544392?fr=aladdin)(mask)的概念:掩膜是用一副二值化图片对另外一幅图片进行局部的遮挡,看下图就一目了然了:
54+
55+
![&#x63A9;&#x819C;&#x6982;&#x5FF5;](http://blog.codec.wang/cv2_understand_mask.jpg)
56+
57+
所以我们的思路就是把原图中要放logo的区域抠出来,再把logo放进去就行了:
58+
59+
```python
60+
img1 = cv2.imread('lena.jpg')
61+
img2 = cv2.imread('opencv-logo-white.png')
62+
63+
# 把logo放在左上角,所以我们只关心这一块区域
64+
rows, cols = img2.shape[:2]
65+
roi = img1[:rows, :cols]
66+
67+
# 创建掩膜
68+
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
69+
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
70+
mask_inv = cv2.bitwise_not(mask)
71+
72+
# 保留除logo外的背景
73+
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
74+
dst = cv2.add(img1_bg, img2) # 进行融合
75+
img1[:rows, :cols] = dst # 融合后放在原图上
76+
```
77+
78+
> 经验之谈:掩膜的概念在图像混合/叠加的场景下使用较多,可以多多练习噢!
79+
80+
## 小结
81+
82+
* `cv2.add()`用来叠加两幅图片,`cv2.addWeighted()`也是叠加两幅图片,但两幅图片的权重不一样。
83+
* `cv2.bitwise_and()`, `cv2.bitwise_not()`, `cv2.bitwise_or()`, `cv2.bitwise_xor()`分别执行按位与/或/非/异或运算。掩膜就是用来对图片进行全局或局部的遮挡。
84+
85+
## 接口文档
86+
87+
* [cv2.add\(\)](https://docs.opencv.org/4.0.0/d2/de8/group__core__array.html#ga10ac1bfb180e2cfda1701d06c24fdbd6)
88+
* [cv2.addWeighted\(\)](https://docs.opencv.org/4.0.0/d2/de8/group__core__array.html#gafafb2513349db3bcff51f54ee5592a19)
89+
* [cv2.bitwise\_and\(\)](https://docs.opencv.org/4.0.0/d2/de8/group__core__array.html#ga60b4d04b251ba5eb1392c34425497e14)
90+
* [cv2.bitwise\_not\(\)](https://docs.opencv.org/4.0.0/d2/de8/group__core__array.html#ga0002cf8b418479f4cb49a75442baee2f)
91+
92+
## 引用
93+
94+
* [本节源码](https://github.com/codecwang/OpenCV-Python-Tutorial/tree/master/09-Image-Blending)
95+
* [掩膜](https://baike.baidu.com/item/%E6%8E%A9%E8%86%9C/8544392?fr=aladdin)
96+
* [Arithmetic Operations on Images](http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_core/py_image_arithmetics/py_image_arithmetics.html)
97+

0 commit comments

Comments
 (0)