обратно

import java.io.*;
import java.awt.*;


public class Obraz2Vector{

   public int X[];
   public int X_len;

   Obraz2Vector( boolean obraz [][], int IDEAL_Y, int IDEAL_X, String name_razbFile, int razb_y, int razb_x)
   {


	FileOutputStream razbFile;
	int i, j;
	int lx, ly, ri, rj, k0, k1, k;
	int razb [][];
	int razb_hor [];
	int razb_ver [];

	X_len = razb_x*razb_y + razb_x + razb_y;
	X = new int [X_len];

  try{ 
	razbFile = new FileOutputStream(name_razbFile);


	// Определяем коэффициент значимости черного цвета
	k0 = 0; k1 = 0;
	for ( i = 0; i < IDEAL_Y; i ++ ) 
		for ( j = 0; j < IDEAL_X; j ++ )
			if (obraz [i][j]) k1 ++;
			else k0 ++;
	k = k0 / k1; 
	
	// Разбиваем на квадраты, заполняем razb	
	razb = new int [razb_y][razb_x];
	lx = IDEAL_X / razb_x;
	ly = IDEAL_Y / razb_y;
	for ( ri = 0; ri < razb_y; ri ++ )
		for ( rj = 0; rj < razb_x; rj ++ )
		{
                        k0 = 0; k1 = 0;
			
			if ( ri != razb_y - 1 && rj != razb_x - 1 ) // Если квадраты не крайние
				for ( i = 0; i < ly; i ++ ) 
					for ( j = 0; j < lx; j ++ )
						if (obraz [ri*ly+i][rj*lx+j])
							k1 ++;
						else 
							k0 ++;
			if ( ri == razb_y - 1 && rj != razb_x - 1) // Если квадрат нижний
				for ( i = ri*ly; i < IDEAL_Y; i ++ )
					for ( j = 0; j < lx; j ++ )
						if (obraz [i][rj*lx+j])
							k1 ++;
						else 
							k0 ++;
			if ( ri != razb_y - 1 && rj == razb_x - 1) // Если квадрат правый
				for ( i = 0; i < ly; i ++ )
					for ( j = rj*lx; j < IDEAL_X; j ++ )
						if (obraz [ri*ly+i][j])
							k1 ++;
						else 
							k0 ++;
			if ( ri == razb_y - 1 && rj == razb_x - 1) // Если квадрат правый-нижний
				for ( i = ri*ly; i < IDEAL_Y; i ++ )
					for ( j = rj*lx; j < IDEAL_X; j ++ )
						if (obraz [i][j])
							k1 ++;
						else 
							k0 ++;
			if ( k1 * k >= k0 ) razb [ri][rj] = 1;
			else razb [ri][rj] = -1;
		}	

	// Второй способ - считаем количество персечений черных областей с
	// горизонтальными и вертикальными линиями
	razb_hor = new int [razb_x];
	razb_ver = new int [razb_y];
	lx = IDEAL_X / ( razb_x - 1 );
	ly = IDEAL_Y / ( razb_y - 1 );

	// Горизонтальные линии
	for ( i = 0; i < razb_y - 1; i ++ )
	{
		if ( obraz [i*ly][0])
			k1 = 1;
		else 
			k1 = 0;
		for ( j = 1; j < IDEAL_X; j ++ )
			if ( obraz [i*ly][j] && !obraz [i*ly][j-1] )
				k1 ++;
		if ( k1 > 1 ) 
			razb_hor [i] = 1;
		else 
			razb_hor [i] = -1;
	}
	if ( obraz [IDEAL_Y-1][0] )
		k1 = 1;
	else 
		k1 = 0;
	for ( j = 1; j < IDEAL_X; j ++ )
		if ( obraz [IDEAL_Y-1][j] && !obraz [IDEAL_Y-1][j-1] )
			k1 ++;
	if ( k1 > 1 ) 
		razb_hor [razb_y - 1] = 1;
	else 
		razb_hor [razb_y - 1] = -1;

	// Вертикальные линии
	for ( j = 0; j < razb_x - 1; j ++ )
	{
		if ( obraz [0][j*lx] )
			k1 = 1;
		else 
			k1 = 0;
		for ( i = 1; i < IDEAL_Y; i ++ )
			if ( obraz [i][j*lx] && !obraz [i-1][j*lx] )
				k1 ++;
		if ( k1 > 1 ) 
			razb_ver [j] = 1;
		else 
			razb_ver [j] = -1;
	}

	if ( obraz [0][IDEAL_X-1] )
		k1 = 1;
	else 
		k1 = 0;
	for ( i = 1; i < IDEAL_Y; i ++ )
		if ( obraz [i][IDEAL_X-1] && !obraz [i-1][IDEAL_X-1] )
			k1 ++;
	if ( k1 > 1 ) 
		razb_ver [razb_x - 1] = 1;
	else 
		razb_ver [razb_x - 1] = -1;





	//	Сбросим образ в файл razb
	for ( ri = 0; ri < razb_y; ri ++ )
	{
		for ( rj = 0; rj < razb_x; rj ++ )
			if ( razb [ri][rj] == 1 )
				razbFile.write('1');
			else
				if ( razb [ri][rj] == -1 )
					razbFile.write('0');
				else
					razbFile.write('?');
		razbFile.write('\n');
	}

	razbFile.write(' ');
	for ( rj = 0; rj < razb_x; rj ++ )
		if ( razb_ver [rj] == 1 )
			razbFile.write('1');
		else
			if ( razb_ver [rj] == -1 )
				razbFile.write('0');
			else
				razbFile.write('?');
	razbFile.write('\n');

	for ( ri = 0; ri < razb_y; ri ++ )
	{
		if ( razb_hor [ri] == 1 )
			razbFile.write('1');
		else
			if ( razb_hor [ri] == -1 )
				razbFile.write('0');
			else
				razbFile.write('?');
		razbFile.write('\n');
	}
	System.out.println("По образу построен входной вектор (файл "+name_razbFile+")");

	// Собираем входной вектор X для персептрона 
	for ( ri = 0; ri < razb_y; ri ++ )  // Алгоритм с квадратами
		for ( rj = 0; rj < razb_x; rj ++ )
			X [ ri * razb_x + rj ] = razb [ri][rj];
	for ( ri = 0; ri < razb_y; ri ++ ) // Алгоритм с линиями - горизонтальные
		X [ razb_y * razb_x + ri] = razb_hor [ri];
	for ( rj = 0; rj < razb_x; rj ++ ) // Алгоритм с линиями - вертикальные
		X [ razb_y * razb_x + razb_y + rj] = razb_ver [rj];

   } 
   catch(IOException e) 
   {System.out.println("Чего-то с файлом #2");System.exit(0);}

   }
}

 обратно