Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
CSDN 技术社区
skill_tree_opencv
提交
7258c669
S
skill_tree_opencv
项目概览
CSDN 技术社区
/
skill_tree_opencv
通知
148
Star
9
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
2
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
skill_tree_opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
2
Issue
2
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
7258c669
编写于
12月 08, 2021
作者:
F
feilong
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
水鸭连通性分析
上级
05adb61e
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
161 addition
and
0 deletion
+161
-0
data/1.OpenCV初阶/2.二值图像处理/4.连通区域分析/connect.md
data/1.OpenCV初阶/2.二值图像处理/4.连通区域分析/connect.md
+111
-0
data/1.OpenCV初阶/2.二值图像处理/4.连通区域分析/connect.py
data/1.OpenCV初阶/2.二值图像处理/4.连通区域分析/connect.py
+50
-0
data/1.OpenCV初阶/2.二值图像处理/4.连通区域分析/duck.jpeg
data/1.OpenCV初阶/2.二值图像处理/4.连通区域分析/duck.jpeg
+0
-0
data/1.OpenCV初阶/2.二值图像处理/4.连通区域分析/duck_box.png
data/1.OpenCV初阶/2.二值图像处理/4.连通区域分析/duck_box.png
+0
-0
data/1.OpenCV初阶/2.二值图像处理/4.连通区域分析/pixel_region.jpg
data/1.OpenCV初阶/2.二值图像处理/4.连通区域分析/pixel_region.jpg
+0
-0
未找到文件。
data/1.OpenCV初阶/2.二值图像处理/4.连通区域分析/connect.md
0 → 100644
浏览文件 @
7258c669
# 框住水鸭子
OpenCV 里的连通区域分析可以将具有相同像素值且位置相邻的前景像素点组成的图像区域识别出来。有两种像素相邻的定义:

通过OpenCV的连通区域分析算法,我们可以将下图的水鸭子的外框框出来:

框架代码如下:
```
python
import
cv2
import
numpy
as
np
import
matplotlib.pyplot
as
plt
def
close_op
(
img
):
kernel
=
np
.
ones
((
3
,
3
),
np
.
uint8
)
img1
=
cv2
.
dilate
(
img
,
kernel
,
iterations
=
1
)
img2
=
cv2
.
erode
(
img1
,
kernel
,
iterations
=
1
)
return
img2
def
show_images
(
images
):
i
=
0
for
title
in
images
:
plt
.
subplot
(
2
,
3
,
i
+
1
),
plt
.
imshow
(
images
[
title
],
'gray'
)
plt
.
title
(
title
)
plt
.
xticks
([]),
plt
.
yticks
([])
i
+=
1
plt
.
show
()
if
__name__
==
'__main__'
:
duck_origin
=
cv2
.
imread
(
'duck.jpeg'
,
-
1
)
duck_box
=
duck_origin
.
copy
()
duck_gray
=
cv2
.
cvtColor
(
duck_box
,
cv2
.
COLOR_BGR2GRAY
)
duck_gray_with_closed
=
close_op
(
duck_gray
)
ret
,
duck_binary
=
cv2
.
threshold
(
duck_gray_with_closed
,
127
,
255
,
cv2
.
THRESH_BINARY
)
# TODO(You): 请实现识别鸭子区域并用框出来的代码
images
=
{
'duck_origin'
:
duck_origin
,
'duck_gray'
:
duck_gray
,
'duck_gray_with_closed_op'
:
duck_gray_with_closed
,
'duck_binary'
:
duck_binary
,
'duck_box'
:
duck_box
}
show_images
(
images
)
```
以下代码实现正确的是?
## 答案
```
python
ret
,
labels
,
stats
,
centroid
=
cv2
.
connectedComponentsWithStats
(
duck_binary
)
duck_area
=
sorted
(
stats
,
key
=
lambda
s
:
s
[
-
1
],
reverse
=
False
)[
-
2
]
cv2
.
rectangle
(
duck_box
,
(
duck_area
[
0
],
duck_area
[
1
]),
(
duck_area
[
0
]
+
duck_area
[
2
],
duck_area
[
1
]
+
duck_area
[
3
]),
(
255
,
0
,
0
),
3
)
```
## 选项
### 排序后取错位置
```
python
ret
,
labels
,
stats
,
centroid
=
cv2
.
connectedComponentsWithStats
(
duck_binary
)
duck_area
=
sorted
(
stats
,
key
=
lambda
s
:
s
[
-
1
],
reverse
=
False
)[
-
1
]
cv2
.
rectangle
(
duck_box
,
(
duck_area
[
0
],
duck_area
[
1
]),
(
duck_area
[
0
]
+
duck_area
[
2
],
duck_area
[
1
]
+
duck_area
[
3
]),
(
255
,
0
,
0
),
3
)
```
### 连通分析传入了灰度图
```
python
ret
,
labels
,
stats
,
centroid
=
cv2
.
connectedComponentsWithStats
(
duck_gray
)
duck_area
=
sorted
(
stats
,
key
=
lambda
s
:
s
[
-
1
],
reverse
=
False
)[
-
1
]
cv2
.
rectangle
(
duck_box
,
(
duck_area
[
0
],
duck_area
[
1
]),
(
duck_area
[
0
]
+
duck_area
[
2
],
duck_area
[
1
]
+
duck_area
[
3
]),
(
255
,
0
,
0
),
3
)
```
### 矩形框画错
```
python
ret
,
labels
,
stats
,
centroid
=
cv2
.
connectedComponentsWithStats
(
duck_binary
)
duck_area
=
sorted
(
stats
,
key
=
lambda
s
:
s
[
-
1
],
reverse
=
False
)[
-
1
]
cv2
.
rectangle
(
duck_box
,
(
duck_area
[
0
],
duck_area
[
1
]),
(
duck_area
[
2
],
duck_area
[
3
]),
(
255
,
0
,
0
),
3
)
```
data/1.OpenCV初阶/2.二值图像处理/4.连通区域分析/connect.py
0 → 100644
浏览文件 @
7258c669
import
cv2
import
numpy
as
np
import
matplotlib.pyplot
as
plt
def
close_op
(
img
):
kernel
=
np
.
ones
((
3
,
3
),
np
.
uint8
)
img1
=
cv2
.
dilate
(
img
,
kernel
,
iterations
=
1
)
img2
=
cv2
.
erode
(
img1
,
kernel
,
iterations
=
1
)
return
img2
def
show_images
(
images
):
i
=
0
for
title
in
images
:
plt
.
subplot
(
2
,
3
,
i
+
1
),
plt
.
imshow
(
images
[
title
],
'gray'
)
plt
.
title
(
title
)
plt
.
xticks
([]),
plt
.
yticks
([])
i
+=
1
plt
.
show
()
if
__name__
==
'__main__'
:
duck_origin
=
cv2
.
imread
(
'duck.jpeg'
,
-
1
)
duck_box
=
duck_origin
.
copy
()
duck_gray
=
cv2
.
cvtColor
(
duck_box
,
cv2
.
COLOR_BGR2GRAY
)
duck_gray_with_closed
=
close_op
(
duck_gray
)
ret
,
duck_binary
=
cv2
.
threshold
(
duck_gray_with_closed
,
127
,
255
,
cv2
.
THRESH_BINARY
)
ret
,
labels
,
stats
,
centroid
=
cv2
.
connectedComponentsWithStats
(
duck_binary
)
duck_area
=
sorted
(
stats
,
key
=
lambda
s
:
s
[
-
1
],
reverse
=
False
)[
-
2
]
cv2
.
rectangle
(
duck_box
,
(
duck_area
[
0
],
duck_area
[
1
]),
(
duck_area
[
0
]
+
duck_area
[
2
],
duck_area
[
1
]
+
duck_area
[
3
]),
(
255
,
0
,
0
),
3
)
images
=
{
'duck_origin'
:
duck_origin
,
'duck_gray'
:
duck_gray
,
'duck_gray_with_closed_op'
:
duck_gray_with_closed
,
'duck_binary'
:
duck_binary
,
'duck_box'
:
duck_box
}
show_images
(
images
)
data/1.OpenCV初阶/2.二值图像处理/4.连通区域分析/duck.jpeg
0 → 100644
浏览文件 @
7258c669
138.5 KB
data/1.OpenCV初阶/2.二值图像处理/4.连通区域分析/duck_box.png
0 → 100644
浏览文件 @
7258c669
244.9 KB
data/1.OpenCV初阶/2.二值图像处理/4.连通区域分析/pixel_region.jpg
0 → 100644
浏览文件 @
7258c669
29.2 KB
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录