обратно
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);}
}
}
обратно