//访问标志
private static int[,] visited ;
/// <summary>
/// 求最大连通区域
/// </summary>
/// <param name="image">二值化的图像</param>
public static void GettheMaxBlock(Image<Bgr, Byte> image)
{
int comps;
visited = new int[image.Height, image.Width];
for (int j = 0; j < image.Height; j++)
{
for (int k = 0; k < image.Width; k++)
{
visited[j, k] = 0;
}
}
comps = DFSTraverse(image);
int[] compenents = new int[comps];
for (int i = 0; i < image.Height; i++)
{
for (int j = 0; j < image.Width; j++)
{
if (visited[i, j] != 0)
compenents[visited[i, j]]++;
}
}
int MI = MaxIndex(compenents);
for (int i = 0; i < image.Height; i++)
{
for (int j = 0; j < image.Width; j++)
{
if (visited[i, j] != MI)
{
image[i, j] = BlackBgr;
}
else
{
image[i, j] = WhiteBgr;
}
}
}
}
/// <summary>
/// 非递归深度搜索,二维数组表示的矩阵
/// </summary>
/// <param name="Graph"></param>
/// <returns></returns>
private static int DFSTraverse(Image<Bgr, Byte> Graph)
{
Stack<Point> stack = new Stack<Point>();
int n = 1;
for (int i = 0; i < Graph.Height; i++)
{
for (int j = 0; j < Graph.Width; j++)
{
Point current = new Point(i, j);
if (i < 0 || i > Graph.Height - 1 || j < 0 || j > Graph.Width - 1 || Graph[i, j].Equals(BlackBgr))
{
}
//if white zone but visited, return
if (Graph[i, j].Equals(WhiteBgr) && visited[i, j] > 0)
{
}
else
{
stack.Push(current);
visited[i, j] = n;
while (stack.Count != 0)
{
current = stack.Peek();
if (!Findneighbors(Graph, current.X, current.Y).IsEmpty)
{
current = Findneighbors(Graph, current.X, current.Y);
stack.Push(current);
visited[current.X, current.Y] = n;
}
else
{
stack.Pop();
}
}
n++;
}
}
}
return n;
}
/// <summary>
/// 8领域寻找连通点
/// </summary>
/// <param name="Graph">二值化图像</param>
/// <param name="x">当前点x坐标</param>
/// <param name="y">当前点y坐标</param>
/// <returns></returns>
private static Point Findneighbors(Image<Bgr, Byte> Graph, int x, int y)
{
// 左上
if (x - 1 < 0 || x - 1 > Graph.Height - 1 || y - 1 < 0 || y - 1 > Graph.Width - 1)
{
return new Point();
}
if (Graph[x - 1, y - 1].Equals(WhiteBgr) && visited[x - 1, y - 1] == 0)
{
return new Point(x - 1, y - 1);
}
// 正上
if (x - 1 < 0 || x - 1 > Graph.Height - 1 || y < 0 || y > Graph.Width - 1)
{
return new Point();
}
if (Graph[x - 1, y].Equals(WhiteBgr) && visited[x - 1, y] == 0)
{
return new Point(x - 1, y);
}
// 右上
if (x - 1 < 0 || x - 1 > Graph.Height - 1 || y + 1 < 0 || y + 1 > Graph.Width - 1)
{
return new Point();
}
if (Graph[x - 1, y + 1].Equals(WhiteBgr) && visited[x - 1, y + 1] == 0)
{
return new Point(x - 1, y + 1);
}
// 正右
if (x < 0 || x > Graph.Height - 1 || y + 1 < 0 || y + 1 > Graph.Width - 1)
{
return new Point();
}
if (Graph[x, y + 1].Equals(WhiteBgr) && visited[x, y + 1] == 0)
{
return new Point(x, y + 1);
}
// 右下
if (x + 1 < 0 || x + 1 > Graph.Height - 1 || y + 1 < 0 || y + 1 > Graph.Width - 1)
{
return new Point();
}
if (Graph[x + 1, y + 1].Equals(WhiteBgr) && visited[x + 1, y + 1] == 0)
{
return new Point(x + 1, y + 1);
}
// 正下
if (x + 1 < 0 || x + 1 > Graph.Height - 1 || y < 0 || y > Graph.Width - 1)
{
return new Point();
}
if (Graph[x + 1, y].Equals(WhiteBgr) && visited[x + 1, y] == 0)
{
return new Point(x + 1, y);
}
// 左下
if (x + 1 < 0 || x + 1 > Graph.Height - 1 || y - 1 < 0 || y - 1 > Graph.Width - 1)
{
return new Point();
}
if (Graph[x + 1, y - 1].Equals(WhiteBgr) && visited[x + 1, y - 1] == 0)
{
return new Point(x + 1, y - 1);
}
// 正左
if (x < 0 || x > Graph.Height - 1 || y - 1 < 0 || y - 1 > Graph.Width - 1)
{
return new Point();
}
if (Graph[x, y - 1].Equals(WhiteBgr) && visited[x, y - 1] == 0)
{
return new Point(x, y - 1);
}
return new Point();
}
/// <summary>
/// 返回数组中最大元素的索引
/// </summary>
/// <param name="m_Array">数组</param>
/// <returns>最大元素的索引</returns>
private static int MaxIndex(int[] m_Array)
{
int m_Index = 0;
int m_Max = m_Array[0];
for (int i = 0; i < m_Array.Length; i++)
{
if (m_Array[i] > m_Max)
{
m_Max = m_Array[i];
m_Index = i;
}
}
return m_Index;
}