洪水填充区域
1.实验目的
学习图像的洪水填充区域。
2.实验原理
洪水填充(Flood Fill) 是图像处理中的一种区域生长算法,用来从一个“种子像素”开始,逐步扩展选中与其颜色相似的相邻像素,从而形成一个“颜色一致的区域”。这个操作非常像你在画图工具中用“油漆桶”点击某个区域时看到的效果。
2.1 填充目标
从一个种子点 (x, y) 开始:
- 判断该点的颜色与周围像素的颜色是否在允许的“相似度”范围内;
- 若满足相似性条件,则将该像素填充为目标颜色;
- 并继续检查该像素的邻居(上下左右或8个方向);
- 递归或迭代地完成整个区域填充。

2.2 核心原理
1.起始条件
- 给定一张图像
img - 给定起始种子点
(x, y) - 提供颜色相似性的阈值(如
seed_threshold和floating_threshold)
2.颜色相似性判断
判断某个像素 P 是否应该被填充,需满足以下两个条件:
- 与 种子点 的颜色差异 <
seed_threshold - 与 已填充区域中相邻像素 的颜色差异 <
floating_threshold
颜色差异常用欧氏距离公式计算:
diff = sqrt((R1-R2)^2 + (G1-G2)^2 + (B1-B2)^2) / 255.0
3.区域扩展方式
使用 递归 或 队列(广度优先) 方式,向上下左右(或8邻域)方向扩展:
↑
← (x, y) →
↓
只要新像素满足颜色相似性,就继续往外扩展。
3.代码解析
导入模块
import time, os, gc, sys
from media.sensor import *
from media.display import *
from media.media import *
导入系统相关模块:
time:用于计时(如帧率统计)。os:包含控制IDE退出点的接口。gc:垃圾回收模块,手动释放内存。sys:与系统交互,但在此代码中暂未使用。
导入 CanMV 平台的三个核心模块:
sensor:图像采集传感器接口。display:图像显示接口。media:媒体管理器,处理缓冲区分配与释放。
初始化传感器对象
DETECT_WIDTH = 480
DETECT_HEIGHT = 360
sensor = None
定义图像分辨率常量(采集图像和显示图像使 用同一尺寸)。
初始化传感器对象为 None,以便后续统一管理其资源释放。
创建传感器对象
sensor = Sensor(width=DETECT_WIDTH, height=DETECT_HEIGHT)
创建传感器对象,指定图像宽度与高度。实际会打开 /dev/video0 设备并尝试匹配输入源。
sensor.reset()
硬件级重置传感器(软复位),以确保进入已知状态。
sensor.set_framesize(width=DETECT_WIDTH, height=DETECT_HEIGHT)
设置传感器图像输出的大小(这里与显示分辨率一致)。
sensor.set_pixformat(Sensor.RGB565)
设置图像格式为 RGB565(每像素16位,比RGB888更省内存)。
初始化显示屏对象
Display.init(Display.AML020T, to_ide=True)
初始化 MIPI 显示屏(AML020T驱动)。to_ide=True 表示图像也会同步显示到 IDE(方便调试)。
初始化媒体管理
MediaManager.init()
管理图像缓冲区与内部共享内存。
启动摄像头
sensor.run()
启动摄像头进行图像采集。
fps = time.clock()
创建 FPS(帧率)统计对象,用于计算图像处理速度。