数学化图像是一个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