Skip to content

Commit 9ae5a74

Browse files
committed
second commit
1 parent 0d4929c commit 9ae5a74

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+638
-41
lines changed

README.md

+60-41
Original file line numberDiff line numberDiff line change
@@ -2,45 +2,64 @@
22
This repository contains source code of OpenCV Tutorial application, the environment is python3.0 and opencv4.0
33

44
## Learning Road
5+
- ✔️ : **Basic**
6+
- ✏️ : **Attention**
7+
- ❣️ : **Important**
8+
59
No | Description | TODO
6-
:--------: | :--------: | :--------:
7-
code_001 | [OpenCV之图片读取与显示](python/code_001/opencv_001.py) | ✔️
8-
code_002 | [OpenCV之图片灰度化](python/code_002/opencv_002.py) | ✔️
9-
code_003 | [OpenCV之图像创建与赋值](python/code_003/opencv_003.py) | ✔️
10-
code_004 | [OpenCV之图像像素读写](python/code_004/opencv_004.py) | ✔️
11-
code_005 | [OpenCV之图像像素算术操作(加减乘除)](python/code_005/opencv_005.py) | ✔️
12-
code_006 | [OpenCV之图像伪彩色增强](python/code_006/opencv_006.py) | ✔️
13-
code_007 | [OpenCV之图像像素操作(逻辑操作)](python/code_007/opencv_007.py) | ✔️
14-
code_008 | [OpenCV之图像通道分离合并](python/code_008/opencv_008.py) | ✔️
15-
code_009 | [OpenCV之色彩空间与色彩空间转换](python/code_009/opencv_009.py) | ✔️
16-
code_010 | [OpenCV之图像像素值统计](python/code_010/opencv_010.py) | ✔️
17-
code_011 | [OpenCV之图像像素归一化](python/code_011/opencv_011.py) | ✔️
18-
code_012 | [OpenCV之视频读写](python/code_012/opencv_012.py) | ✔️
19-
code_013 | [OpenCV之图像翻转](python/code_013/opencv_013.py) | ✔️
20-
code_014 | [OpenCV之图像插值](python/code_014/opencv_014.py) | ✔️
21-
code_015 | [OpenCV之绘制几何形状](python/code_015/opencv_015.py) | ✔️
22-
code_016 | [OpenCV之图像ROI与ROI操作](python/code_016/opencv_016.py) | ✔️
23-
code_017 | [OpenCV之图像直方图](python/code_017/opencv_017.py) | ✔️
24-
code_018 | [OpenCV之图像直方图均衡化](python/code_018/opencv_018.py) | ✔️
25-
code_019 | [OpenCV之图像直方图比较](python/code_019/opencv_019.py) | ✔️
26-
code_020 | [OpenCV之图像直方图反向投影](python/code_020/opencv_020.py) | ✔️
27-
code_021 | [OpenCV之图像卷积操作](python/code_021/opencv_021.py) | ✔️
28-
code_022 | [OpenCV之图像均值与高斯模糊](python/code_022/opencv_022.py) | ✔️
29-
code_023 | [OpenCV之中值模糊](python/code_023/opencv_023.py) | ✔️
30-
code_024 | [OpenCV之图像噪声](python/code_024/opencv_024.py) | ✔️
31-
code_025 | [OpenCV之图像去噪声](python/code_025/opencv_025.py) | ✔️
32-
code_026 | [OpenCV之边缘保留滤波算法 – 高斯双边模糊](python/code_026/opencv_026.py) | ✔️
33-
code_027 | [OpenCV之边缘保留滤波算法 – 均值迁移模糊(mean-shift blur)](python/code_027/opencv_027.py) | ✔️
34-
code_028 | [OpenCV之图像积分图算法](python/code_028/opencv_028.py) | ✔️
35-
code_029 | [OpenCV之快速的图像边缘滤波算法](python/code_029/opencv_029.py) | ✔️
36-
code_030 | [OpenCV之自定义滤波器](python/code_030/opencv_030.py) | ✔️
37-
code_031 | [OpenCV之Sobel算子](python/code_031/opencv_031.py) | ✔️
38-
code_032 | [OpenCV之更多梯度算子](python/code_032/opencv_032.py) | ✔️
39-
code_033 | [OpenCV之图像梯度 – 拉普拉斯算子(二阶导数算子)](python/code_033/opencv_033.py) | ✔️
40-
code_034 | [OpenCV之图像锐化](python/code_034/opencv_034.py) | ✔️
41-
code_035 | [OpenCV之USM 锐化增强算法](python/code_035/opencv_035.py) | ✔️
42-
code_036 | [OpenCV之Canny边缘检测器](python/code_036/opencv_036.py) | ✔️
43-
code_037 | [OpenCV之图像金字塔](python/code_037/opencv_037.py) | ✔️
44-
code_038 | [OpenCV之拉普拉斯金字塔](python/code_038/opencv_038.py) | ✔️
45-
code_039 | [OpenCV之图像模板匹配](python/code_039/opencv_039.py) | ✔️
46-
code_040 | [OpenCV之二值图像介绍](python/code_040/opencv_040.py) | ✔️
10+
:--------: | :--------: | :--------:
11+
code_001 | [OpenCV之图片读取与显示](python/code_001/opencv_001.py) | ✔️
12+
code_002 | [OpenCV之图片灰度化](python/code_002/opencv_002.py) | ✔️
13+
code_003 | [OpenCV之图像创建与赋值](python/code_003/opencv_003.py) | ✔️
14+
code_004 | [OpenCV之图像像素读写](python/code_004/opencv_004.py) | ✔️
15+
code_005 | [OpenCV之图像像素算术操作(加减乘除)](python/code_005/opencv_005.py) | ✔️
16+
code_006 | [OpenCV之图像伪彩色增强](python/code_006/opencv_006.py) | ✔️
17+
code_007 | [OpenCV之图像像素操作(逻辑操作)](python/code_007/opencv_007.py) | ✔️
18+
code_008 | [OpenCV之图像通道分离合并](python/code_008/opencv_008.py) | ✔️
19+
code_009 | [OpenCV之色彩空间与色彩空间转换](python/code_009/opencv_009.py) | ✏️
20+
code_010 | [OpenCV之图像像素值统计](python/code_010/opencv_010.py) | ✔️
21+
code_011 | [OpenCV之图像像素归一化](python/code_011/opencv_011.py) | ✔️
22+
code_012 | [OpenCV之视频读写](python/code_012/opencv_012.py) | ✔️
23+
code_013 | [OpenCV之图像翻转](python/code_013/opencv_013.py) | ✔️
24+
code_014 | [OpenCV之图像插值](python/code_014/opencv_014.py) | ✔️
25+
code_015 | [OpenCV之绘制几何形状](python/code_015/opencv_015.py) | ✔️
26+
code_016 | [OpenCV之图像ROI与ROI操作](python/code_016/opencv_016.py) | ✔️
27+
code_017 | [OpenCV之图像直方图](python/code_017/opencv_017.py) | ✔️
28+
code_018 | [OpenCV之图像直方图均衡化](python/code_018/opencv_018.py) | ✏️
29+
code_019 | [OpenCV之图像直方图比较](python/code_019/opencv_019.py) | ✔️
30+
code_020 | [OpenCV之图像直方图反向投影](python/code_020/opencv_020.py) | ✔️
31+
code_021 | [OpenCV之图像卷积操作](python/code_021/opencv_021.py) | ✔️
32+
code_022 | [OpenCV之图像均值与高斯模糊](python/code_022/opencv_022.py) | ❣️
33+
code_023 | [OpenCV之中值模糊](python/code_023/opencv_023.py) | ✔️
34+
code_024 | [OpenCV之图像噪声](python/code_024/opencv_024.py) | ✔️
35+
code_025 | [OpenCV之图像去噪声](python/code_025/opencv_025.py) | ✔️
36+
code_026 | [OpenCV之边缘保留滤波算法 – 高斯双边模糊](python/code_026/opencv_026.py) | ✔️
37+
code_027 | [OpenCV之边缘保留滤波算法 – 均值迁移模糊(mean-shift blur)](python/code_027/opencv_027.py) | ✔️
38+
code_028 | [OpenCV之图像积分图算法](python/code_028/opencv_028.py) | ✔️
39+
code_029 | [OpenCV之快速的图像边缘滤波算法](python/code_029/opencv_029.py) | ✔️
40+
code_030 | [OpenCV之自定义滤波器](python/code_030/opencv_030.py) | ✔️
41+
code_031 | [OpenCV之Sobel算子](python/code_031/opencv_031.py) | ✔️
42+
code_032 | [OpenCV之更多梯度算子](python/code_032/opencv_032.py) | ✔️
43+
code_033 | [OpenCV之图像梯度 – 拉普拉斯算子(二阶导数算子)](python/code_033/opencv_033.py) | ✔️
44+
code_034 | [OpenCV之图像锐化](python/code_034/opencv_034.py) | ✔️
45+
code_035 | [OpenCV之USM 锐化增强算法](python/code_035/opencv_035.py) | ✔️
46+
code_036 | [OpenCV之Canny边缘检测器](python/code_036/opencv_036.py) | ❣️
47+
code_037 | [OpenCV之图像金字塔](python/code_037/opencv_037.py) | ✔️
48+
code_038 | [OpenCV之拉普拉斯金字塔](python/code_038/opencv_038.py) | ✔️
49+
code_039 | [OpenCV之图像模板匹配](python/code_039/opencv_039.py) | ✔️
50+
code_040 | [OpenCV之二值图像介绍](python/code_040/opencv_040.py) | ✔️
51+
code_041 | [OpenCV之基本阈值操作](python/code_041/opencv_041.py) | ✔️
52+
code_042 | [OpenCV之图像二值寻找法OTSU](python/code_042/opencv_042.py) | ✏️
53+
code_043 | [OpenCV之图像二值寻找法TRIANGLE](python/code_043/opencv_043.py) | ✔️
54+
code_044 | [OpenCV之图像自适应阈值算法](python/code_044/opencv_044.py) | ✏️
55+
code_045 | [OpenCV之图像二值与去噪](python/code_045/opencv_045.py) | ✏️
56+
code_046 | [OpenCV之图像连通组件寻找](python/code_046/opencv_046.py) | ✔️
57+
code_047 | [OpenCV之图像连通组件状态统计](python/code_047/opencv_047.py) | ✔️
58+
code_048 | [OpenCV之轮廓寻找](python/code_048/opencv_048.py) | ❣️
59+
code_049 | [OpenCV之轮廓外接矩形](python/code_049/opencv_049.py) | ❣️
60+
code_050 | [OpenCV之轮廓矩形面积与弧长](python/code_050/opencv_050.py) | ✏️
61+
code_051 | [OpenCV之轮廓逼近](python/code_051/opencv_051.py) | ✔️
62+
code_052 | [OpenCV之几何矩计算中心](python/code_052/opencv_052.py) | ✔️
63+
code_053 | [OpenCV之使用Hu矩阵实现轮廓匹配](python/code_053/opencv_053.py) | ✔️
64+
code_054 | [OpenCV之轮廓圆与椭圆拟合](python/code_054/opencv_054.py) | ✔️
65+
code_055 | [OpenCV之凸包检测](python/code_055/opencv_055.py) | ✏️

python/code_041/master.jpg

57.4 KB
Loading

python/code_041/opencv_041.py

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import cv2 as cv
2+
import numpy as np
3+
#
4+
# THRESH_BINARY = 0
5+
# THRESH_BINARY_INV = 1
6+
# THRESH_TRUNC = 2
7+
# THRESH_TOZERO = 3
8+
# THRESH_TOZERO_INV = 4
9+
#
10+
src = cv.imread("master.jpg")
11+
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
12+
cv.imshow("input", src)
13+
14+
T = 127
15+
16+
# 转换为灰度图像
17+
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
18+
for i in range(5):
19+
ret, binary = cv.threshold(gray, T, 255, i)
20+
cv.imshow("binary_" + str(i), binary)
21+
22+
cv.waitKey(0)
23+
cv.destroyAllWindows()
24+
25+

python/code_042/binary_result.png

603 KB
Loading

python/code_042/lena.png

512 KB
Loading

python/code_042/opencv_042.py

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import cv2 as cv
2+
import numpy as np
3+
#
4+
# THRESH_BINARY = 0
5+
# THRESH_BINARY_INV = 1
6+
# THRESH_TRUNC = 2
7+
# THRESH_TOZERO = 3
8+
# THRESH_TOZERO_INV = 4
9+
#
10+
src = cv.imread("lena.png")
11+
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
12+
cv.imshow("input", src)
13+
h, w = src.shape[:2]
14+
15+
# 自动阈值分割 OTSU
16+
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
17+
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
18+
print("ret :", ret)
19+
cv.imshow("binary", binary)
20+
21+
result = np.zeros([h, w*2, 3], dtype=src.dtype)
22+
result[0:h,0:w,:] = src
23+
result[0:h,w:2*w,:] = cv.cvtColor(binary, cv.COLOR_GRAY2BGR)
24+
cv.putText(result, "input", (10, 30), cv.FONT_ITALIC, 1.0, (0, 0, 255), 2)
25+
cv.putText(result, "binary, threshold = " + str(ret), (w+10, 30), cv.FONT_ITALIC, 1.0, (0, 0, 255), 2)
26+
cv.imshow("result", result)
27+
cv.imwrite("binary_result.png", result)
28+
29+
cv.waitKey(0)
30+
cv.destroyAllWindows()
31+
32+

python/code_043/lena.png

512 KB
Loading

python/code_043/opencv_043.py

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import cv2 as cv
2+
import numpy as np
3+
import tensorflow as tf
4+
5+
tf.enable_eager_execution()
6+
#
7+
# THRESH_BINARY = 0
8+
# THRESH_BINARY_INV = 1
9+
# THRESH_TRUNC = 2
10+
# THRESH_TOZERO = 3
11+
# THRESH_TOZERO_INV = 4
12+
#
13+
src = cv.imread("lena.png")
14+
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
15+
cv.imshow("input", src)
16+
h, w = src.shape[:2]
17+
18+
19+
# 自动阈值分割 TRIANGLE
20+
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
21+
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
22+
print("ret :", ret)
23+
cv.imshow("binary", binary)
24+
25+
result = np.zeros([h, w*2, 3], dtype=src.dtype)
26+
result[0:h,0:w,:] = src
27+
result[0:h,w:2*w,:] = cv.cvtColor(binary, cv.COLOR_GRAY2BGR)
28+
cv.putText(result, "input", (10, 30), cv.FONT_ITALIC, 1.0, (0, 0, 255), 2)
29+
cv.putText(result, "binary, threshold = " + str(ret), (w+10, 30), cv.FONT_ITALIC, 1.0, (0, 0, 255), 2)
30+
cv.imshow("result", result)
31+
cv.imwrite("D:/binary_result.png", result)
32+
33+
cv.waitKey(0)
34+
cv.destroyAllWindows()
35+
36+

python/code_044/binary_result.png

250 KB
Loading

python/code_044/opencv_044.py

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import cv2 as cv
2+
import numpy as np
3+
4+
#
5+
# THRESH_BINARY = 0
6+
# THRESH_BINARY_INV = 1
7+
# THRESH_TRUNC = 2
8+
# THRESH_TOZERO = 3
9+
# THRESH_TOZERO_INV = 4
10+
#
11+
src = cv.imread("text1.png")
12+
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
13+
cv.imshow("input", src)
14+
h, w = src.shape[:2]
15+
16+
17+
# 自动阈值分割 TRIANGLE
18+
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
19+
binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 25, 10)
20+
cv.imshow("binary", binary)
21+
22+
result = np.zeros([h, w*2, 3], dtype=src.dtype)
23+
result[0:h,0:w,:] = src
24+
result[0:h,w:2*w,:] = cv.cvtColor(binary, cv.COLOR_GRAY2BGR)
25+
cv.putText(result, "input", (10, 30), cv.FONT_ITALIC, 1.0, (0, 0, 255), 2)
26+
cv.putText(result, "adaptive threshold", (w+10, 30), cv.FONT_ITALIC, 1.0, (0, 0, 255), 2)
27+
cv.imshow("result", result)
28+
cv.imwrite("binary_result.png", result)
29+
30+
cv.waitKey(0)
31+
cv.destroyAllWindows()
32+
33+

python/code_044/text1.png

143 KB
Loading

python/code_045/binary_result.png

315 KB
Loading

python/code_045/coins.jpg

40.3 KB
Loading

python/code_045/opencv_045.py

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import cv2 as cv
2+
import numpy as np
3+
4+
5+
def method_1(image):
6+
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
7+
t, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
8+
return binary
9+
10+
11+
def method_2(image):
12+
blurred = cv.GaussianBlur(image, (3, 3), 0) # 高斯去噪音
13+
gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)
14+
t, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
15+
return binary
16+
17+
18+
def method_3(image):
19+
blurred = cv.pyrMeanShiftFiltering(image, 10, 100) # 先均值迁移去噪声
20+
gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)
21+
t, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
22+
return binary
23+
24+
25+
src = cv.imread("coins.jpg")
26+
h, w = src.shape[:2]
27+
ret = method_3(src)
28+
29+
result = np.zeros([h, w*2, 3], dtype=src.dtype)
30+
result[0:h,0:w,:] = src
31+
result[0:h,w:2*w,:] = cv.cvtColor(ret, cv.COLOR_GRAY2BGR)
32+
cv.putText(result, "input", (10, 30), cv.FONT_ITALIC, 1.0, (0, 0, 255), 2)
33+
cv.putText(result, "binary", (w+10, 30), cv.FONT_ITALIC, 1.0, (0, 0, 255), 2)
34+
cv.imshow("result", result)
35+
cv.imwrite("binary_result.png", result)
36+
37+
cv.waitKey(0)
38+
cv.destroyAllWindows()
39+
40+

python/code_046/binary.png

1.9 KB
Loading

python/code_046/labels.png

3.8 KB
Loading

python/code_046/opencv_046.py

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import cv2 as cv
2+
import numpy as np
3+
4+
5+
def connected_components_demo(src):
6+
src = cv.GaussianBlur(src, (3, 3), 0)
7+
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
8+
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
9+
cv.imshow("binary", binary)
10+
cv.imwrite('binary.png', binary)
11+
12+
output = cv.connectedComponents(binary, connectivity=8, ltype=cv.CV_32S)
13+
num_labels = output[0]
14+
print(num_labels) # output: 5
15+
labels = output[1]
16+
17+
# 构造颜色
18+
colors = []
19+
for i in range(num_labels):
20+
b = np.random.randint(0, 256)
21+
g = np.random.randint(0, 256)
22+
r = np.random.randint(0, 256)
23+
colors.append((b, g, r))
24+
colors[0] = (0, 0, 0)
25+
26+
# 画出连通图
27+
h, w = gray.shape
28+
image = np.zeros((h, w, 3), dtype=np.uint8)
29+
for row in range(h):
30+
for col in range(w):
31+
image[row, col] = colors[labels[row, col]]
32+
33+
cv.imshow("colored labels", image)
34+
cv.imwrite("labels.png", image)
35+
print("total componets : ", num_labels - 1)
36+
37+
38+
39+
src = cv.imread("pill.png")
40+
h, w = src.shape[:2]
41+
connected_components_demo(src)
42+
cv.waitKey(0)
43+
cv.destroyAllWindows()

python/code_046/pill.png

103 KB
Loading

python/code_047/granule.png

99.2 KB
Loading

python/code_047/labels.png

180 KB
Loading

python/code_047/opencv_047.py

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import cv2 as cv
2+
import numpy as np
3+
4+
5+
def connected_components_stats_demo(src):
6+
src = cv.GaussianBlur(src, (3, 3), 0)
7+
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
8+
ret, binary_ = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
9+
10+
# 使用开运算去掉外部的噪声
11+
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
12+
binary = cv.morphologyEx(binary_, cv.MORPH_OPEN, kernel)
13+
cv.imshow("binary", binary_)
14+
15+
num_labels, labels, stats, centers = cv.connectedComponentsWithStats(binary, connectivity=8, ltype=cv.CV_32S)
16+
colors = []
17+
for i in range(num_labels):
18+
b = np.random.randint(0, 256)
19+
g = np.random.randint(0, 256)
20+
r = np.random.randint(0, 256)
21+
colors.append((b, g, r))
22+
23+
colors[0] = (0, 0, 0)
24+
image = np.copy(src)
25+
for t in range(1, num_labels, 1):
26+
x, y, w, h, area = stats[t]
27+
cx, cy = centers[t]
28+
# 标出中心位置
29+
cv.circle(image, (np.int32(cx), np.int32(cy)), 2, (0, 255, 0), 2, 8, 0)
30+
# 画出外接矩形
31+
cv.rectangle(image, (x, y), (x+w, y+h), colors[t], 1, 8, 0)
32+
cv.putText(image, "No." + str(t), (x, y), cv.FONT_HERSHEY_SIMPLEX, .5, (0, 0, 255), 1);
33+
print("label index %d, area of the label : %d"%(t, area))
34+
35+
cv.imshow("colored labels", image)
36+
cv.imwrite("labels.png", image)
37+
print("total rice : ", num_labels - 1)
38+
39+
40+
input = cv.imread("granule.png")
41+
connected_components_stats_demo(input)
42+
cv.waitKey(0)
43+
cv.destroyAllWindows()

0 commit comments

Comments
 (0)