最近选修了计算机视觉的有关课程,主要目的就是系统地学习一下计算机视觉的有关知识。之前涉及到了一些,但是主要是结合opencv的学习,功能上只会调库,而没有深入思考背后的原理及实现,这次算是补课了。
首先从最简单的二值图像分析开始,这里主要介绍了一个比较重要的知识点,就是如何寻找连通域并标记。
第一种方法就是递归算法,其实可以算作是一种深度搜索,先把原有的图像二值化为0与1,然后把所有1的部分置为-1,这样做的目的是为了区别之后标记类别所要用的1,然后开始遍历,对于像素值为-1的点,首先要进行标记,然后在其邻域进行递归搜索,这里不需要返回处理,因为当一个值周围在没有未标记的-1点,说明邻域已经寻找完毕,退出搜索。值得注意的是,这个算法之所以效率不高,原因是一旦搜索完了一片邻域之后,需要重新再来一遍重新寻找搜索的起始点。
第二种方法是以空间换时间,称为序贯算法,主要思路是,进行从左至右,从上至下的遍历,遍历过程中分情况讨论,其中当上方和左方标记不一致的时候,则需要一步更新等价表的操作,等价表其实就是记录一下哪些虽然标号不同,但是实际可以可以连在一起的相邻区域。
#encoding=utf-8
import numpy as np
class FindConnectedDomain(object):
def __init__(self):
pass
def baseMethod(self,image):
dir = [[1,0],[-1,0],[0,1],[0,-1]] # 方向向量
m, n = im