案例 ©Fu Xianjun. All Rights Reserved.

一、读取图像

python opencv提取部分图片 opencv提取图像_区域生长

知识储备:图像分割与提取的概念

        在图像处理的过程中, 经常需要从图像中将前景对象作为目标图像提取出来。例如无人驾驶技术, 我们关心的是周围的交通工具, 其他障碍物等, 而对于背景本身并不关注, 故而, 我们需要将这些东西从图片(视频)中提取出来, 而忽略那些只有背景的图像。

知识储备:常见的图像分割方法

1. 基于阈值的分割方法:全局阈值法、局部阈值法等

2. 基于区域的分割方法:分水岭方法、区域生长法等

3. 基于边缘的分割方法:Canny边缘检测、轮廓检测等 

4. 基于特定理论的分割方法:聚类、模糊集等(机器学习)

5. 基于神经网络的分割方法:????

知识储备:分水岭算法的概念

        图像的灰度空间很像地球表面的整个地理结构,每个像素的灰度值代表高度。其中的灰度值较大的像素连成的线可以看做山脊,也就是分水岭。        

当水平面上升到一定高度时,水就会溢出当前山谷,可以通过在分水岭上修大坝,从而避免两个山谷的水汇集,这样图像就被分成2个像素集,一个是被水淹没的山谷像素集,一个是分水岭线像素集。最终这些大坝形成的线就对整个图像进行了分区,实现对图像的分割。

python opencv提取部分图片 opencv提取图像_python opencv提取部分图片_02

知识储备:分水岭算法的步骤

python opencv提取部分图片 opencv提取图像_区域生长_03

知识储备:鼠标交互

opencv的鼠标交互操作主要通过两个函数实现: 第一个是cv2.setMouseCallback(windowName, onMouse [, param])

第二个是setMouseCallback()的第二个参数,称为鼠标回调函数onMouse(event, x, y, flags, param)

知识储备:区域生长算法的概念

选取某个种子点(一般实际交互时就是鼠标点击的位置),从图像种子点位置开始,将种子点相邻的符合某个阈值范围内的像素添加到生长区域中,接着判断下一个像素点,直到没有可以符合条件的像素为止,此时分割完毕。

二、分水岭算法

       1、二值化

python opencv提取部分图片 opencv提取图像_灰度值_04

2、形态学操作(移除噪声)

python opencv提取部分图片 opencv提取图像_区域生长_05

python opencv提取部分图片 opencv提取图像_分水岭算法_06

python opencv提取部分图片 opencv提取图像_python opencv提取部分图片_07

python opencv提取部分图片 opencv提取图像_分水岭算法_08

3、距离变换

                剩下的区域不确定是硬币还是背景,这些区域通常在前景和背景接触的区域(或者两个不同硬币接触的区域),我们称之为边界。

通过分水岭算法应该能找到确定的边界。由于硬币之间彼此接触,我们使用另一个确定前景的方法,就是带阈值的距离变换。

        下面左边的图为得到的距离转换图像,其中每个像素的值为其到最近的背景像素(灰度值为0)的距离,可以看到硬币的中心像素值最大(中心离背景像素最远)。对其进行二值处理就得到了分离的前景图(下面中间的图),白色区域肯定是硬币区域,而且还相互分离,下面右边的图为之前的膨胀图减去中间这个表示前景的图。

python opencv提取部分图片 opencv提取图像_python opencv提取部分图片_09

三、鼠标交互

python opencv提取部分图片 opencv提取图像_opencv_10

python opencv提取部分图片 opencv提取图像_opencv_11

四、区域生长算法

1、固定种子点的区域生长算法

python opencv提取部分图片 opencv提取图像_opencv_12

python opencv提取部分图片 opencv提取图像_灰度值_13