你是否正在寻找关于连通域的内容?让我把最俱价值的东西奉献给你:
二值图像求取连通域算法
一幅图像二值化处理后往往包含多个区域,需要通过标记把它们分别提取出来。标记分割后图像中各区域的简单而有效的方法是检查各像素与其相邻像素的连通性。
他们的像素值都为0。此时给该像素一个新的标记(表示一个新的连通域的开始)。
它们中间只有一个像素值为1。此时当前像素的标记=为1的像素值的标记。
它们的像素值都为1且标记相同。此时当前像素的标记=该标记。
它们的像素值为1且标记不同。将其中的较小的值赋给当前像素。之后从另一边回溯到区域的开始像素为止。每次回溯再分别执行上述四个判断步骤,。
这样即可保证所有的连通域都被标记出来。之后再通过对不同的标记赋予不同的颜色或将其加上边框即可完成标记。
回溯法标记连通域 Connect(int x, int y, bool isMarked = false) 8 { { } (x != { 16 if (f(x, y) == 1) 17 { 18 if (mat[x - 1, y] != 0) 19 { Connect(x - 1, y, true); 22 } { 25 if (isMarked == false) } 28 } 29 } (x == { 33 if (f(x, y) == 1) 34 { 35 if (mat[x, y - 1] != 0) 36 { Connect(x, y - 1, true); 39 } { 42 if (isMarked == false) 43 mat[x, y] = ++mark; 44 } 45 } 46 } (x != { 50 if (f(x, y) == 1) 51 { { 54 if (isMarked == false) 55 mat[x, y] = ++mark; 56 } (mat[x, y - 1] == 0 && mat[x - 1, y] != 0) 58 { 59 if (isMarked == false) 60 mat[x, y] = mat[x - 1, y]; { 63 if (mat[x - 1, y] > mat[x, y]) 64 mat[x - 1, y] = mat[x, y]; } 67 } (mat[x, y - 1] != 0 && mat[x - 1, y] == 0) 69 { 70 if (isMarked == false) 71 mat[x, y] = mat[x, y - 1]; { 74 if (mat[x, y - 1] > mat[x, y]) 75 mat[x, y - 1] = mat[x, y]; } 78 } (mat[x, y - 1] != 0 && mat[x - 1, y] != 0 && mat[x, y - 1] == mat[x - 1, y]) 80 { 81 if (isMarked == false) 82 mat[x, y] = mat[x, y - 1]; { 85 if (mat[x, y - 1] > mat[x, y]) 86 { 87 mat[x, y - 1] = mat[x - 1, y] = mat[x, y]; Connect(x, y - 1, true); 90 } 91 } 92 93 } (mat[x, y - 1] != 0 && mat[x - 1, y] != 0 && mat[x, y - 1] != mat[x - 1, y]) 95 { 96 mat[x, y] = Math.Min(mat[x - 1, y], mat[x, y - 1]); Connect(x - 1, y, true); 99 Connect(x, y - 1, true); 100 } 101 } 102 }
执行效果如下:

二值化后的图像

标记了连通域后的图像
当然这个方法的一个问题是执行效率很低,对比较大的图片需要较长时间才能完成标记步骤。但准确率还是比较高的。
参考文献:
[1] 章毓晋. 图像分割. 科学出版社,2001年,pp.63
[2] R.Gonzalez. 数字图像处理. 电子工业出版社, 2014年, pp.38-40
posted @
以上就是关于连通域的全部内容,相信你一定会非常满意。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-3465-1.html
欧盟绝对不会放过这个机会正式转正
任何东西都要一分为二看问题