标记图元

来源:互联网 发布:淘宝账号存在安全风险 编辑:程序博客网 时间:2024/05/02 02:58

数学化图像是一个m*m的像素矩阵。
在单色图像中,每个像素的值要么为0,要么为1,
值为0的像素是图像的背景,而值为1的像素则表示图元上的一个点,
我们称其为图元像素。
如果一个像素在另一个像素的左侧、上部、右侧或下部,
则称为两个像素为相素。
识别图元就是对图元像素进行标记,
当且仅当两个像素属于同一个图图元时,它们的标号相同。

如:
0010000
0011000
0000100
0001100
0100101
1110001
1110011

7*7图像

0020000
0022000
0000300
0003300
0400305
4440005
4440055

标记图元

//源程序

#include "iostream.h"
#include "iomanip.h"
#include "fstream.h"
#define max 100

int graph[max][max];
const int dx[4] = { -1 , 0 , 1 , 0 };
const int dy[4] = { 0 , 1 , 0 , -1 };
ofstream fout("output.txt");

void label( int m , int n )
{
 int map[max*max];
 int begin , end;
 int x , y;
 int id;
 int i , j , k;

 id = 2;
 for( i = 0 ; i < m ; i++ )
  for( j = 0 ; j < n ; j++ )
  {
   if( graph[i][j] == 1 )
   {
    begin = 0;
    end = 0;
    map[0] = i * n + j;
    do
    {
     x = map[begin] % n;
     y = map[begin] / n;
     graph[y][x] = id;
     for( k = 0 ; k < 4 ; k++ )
     {
      x = map[begin] % n + dx[k];
      y = map[begin] / n + dy[k];
      if( x >= 0 && x < n && y >=0 && y < m && graph[y][x] == 1 )
      {
       end++;
       map[end] = y * n + x;
      }
     }
     begin++;
    }while( begin <= end );
    id++;
   }
  }
}
int main()
{
 ifstream fin("input.txt");
 int m , n;
 
 char ch;
 int i , j;
 for( i = 0 ; i < max ; i++ )
  for( j = 0 ; j < max ; j++ )
   graph[i][j] = 0;
 while( fin >> m >> n )
 {
  for( i = 0 ; i < m ; i++ )
   for( j = 0 ; j < n ; j++ )
   {
    fin >> ch;
    if( ch == '1' )
     graph[i][j] = 1;
   }
  cout<<"原始图像"<<endl;
  for( i = 0 ; i < m ; i++ )
  {
   for( j = 0 ; j < n ; j++ )
    cout<<setw(3)<<graph[i][j];
   cout<<endl;
  }

  label( m , n );

  cout<<"处理后的图像"<<endl;
  for( i = 0 ; i < m ; i++ )
  {
   for( j = 0 ; j < n ; j++ )
    cout<<setw(3)<<graph[i][j];
   cout<<endl;
  }
 }
 return 0;
}

//输入文件input.txt
7 7
0010000
0011000
0000100
0001100
0100101
1110001
1110011