package edu.hawaii.jmotif.performance.digits;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
public class RawToDespeckled {
private static final int THRESHOLD = 4;
private static final int STEP = 8;
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(new File(
"data/digits/digits_reduced_50.csv")));
BufferedWriter bw = new BufferedWriter(new FileWriter(new File(
"data/digits/digits_despeckled_50.csv")));
String line = null;
int counter = 0;
while ((line = br.readLine()) != null) {
if (!(line.isEmpty())) {
String label = line.split("\\s+")[0];
int[] series = toArray(line);
int[] dat = despeckle(series);
bw.write(label + " "
+ Arrays.toString(dat).replace("[", "").replace("]", "").replace(", ", " ") + "\n");
counter++;
}
}
bw.close();
br.close();
}
private static int[] toArray(String line) {
int[] res = new int[728];
String[] split = line.split("\\s+");
for (int i = 0; i < 728; i++) {
res[i] = Integer.valueOf(split[i + 1]);
}
return res;
}
public static int[] despeckle(int[] dataString) {
int[][] matrix = new int[28][28];
for (int i = 0; i < dataString.length; i++) {
int row = i % 28;
int col = i / 28;
if (Integer.valueOf(dataString[i]).intValue() < THRESHOLD) {
matrix[row][col] = 0;
}
else {
matrix[row][col] = 1;
}
// System.out.print(matrix[row][col] + ",");
}
// despecle
int n = matrix.length;
int m = matrix[0].length;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int dot = matrix[i][j];
if (dot == 1) {
int t[] = new int[8];
if (i == 0 && j != 0 && j != 27) {
t[0] = t[6] = t[7] = 0;
t[1] = matrix[i][j - 1];
t[2] = matrix[i + 1][j - 1];
t[3] = matrix[i + 1][j];
t[4] = matrix[i + 1][j + 1];
t[5] = matrix[i][j + 1];
}
else if (i == 27 && j != 0 && j != 27) {
t[2] = t[3] = t[4] = 0;
t[0] = matrix[i - 1][j - 1];
t[1] = matrix[i][j - 1];
t[5] = matrix[i][j + 1];
t[6] = matrix[i - 1][j + 1];
t[7] = matrix[i - 1][j];
}
else if (j == 0 && i != 0 && i != 27) {
t[0] = t[1] = t[2] = 0;
t[3] = matrix[i + 1][j];
t[4] = matrix[i + 1][j + 1];
t[5] = matrix[i][j + 1];
t[6] = matrix[i - 1][j + 1];
t[7] = matrix[i - 1][j];
}
else if (j == 27 && i != 0 && i != 27) {
t[6] = t[5] = t[4] = 0;
t[0] = matrix[i - 1][j - 1];
t[1] = matrix[i][j - 1];
t[2] = matrix[i + 1][j - 1];
t[3] = matrix[i + 1][j];
t[7] = matrix[i - 1][j];
}
else if (i == 0 && j == 0) {
t[0] = t[6] = t[7] = t[2] = t[1] = 0;
t[3] = matrix[i + 1][j];
t[4] = matrix[i + 1][j + 1];
t[5] = matrix[i][j + 1];
}
else if (i == 0 && j == 27) {
t[0] = t[6] = t[7] = t[5] = t[4] = 0;
t[1] = matrix[i][j - 1];
t[2] = matrix[i + 1][j - 1];
t[3] = matrix[i + 1][j];
}
else if (i == 27 && j == 0) {
t[0] = t[1] = t[2] = t[3] = t[4] = 0;
t[5] = matrix[i][j + 1];
t[6] = matrix[i - 1][j + 1];
t[7] = matrix[i - 1][j];
}
else if (i == 27 && j == 27) {
t[6] = t[5] = t[4] = t[2] = t[3] = 0;
t[0] = matrix[i - 1][j - 1];
t[1] = matrix[i][j - 1];
t[7] = matrix[i - 1][j];
}
else {
t[0] = matrix[i - 1][j - 1];
t[1] = matrix[i][j - 1];
t[2] = matrix[i + 1][j - 1];
t[3] = matrix[i + 1][j];
t[4] = matrix[i + 1][j + 1];
t[5] = matrix[i][j + 1];
t[6] = matrix[i - 1][j + 1];
t[7] = matrix[i - 1][j];
}
if (sum(t) <= 1) {
matrix[i][j] = 0;
}
}
}
}
int[] res = new int[784];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
res[i * 28 + j] = matrix[j][i];
}
}
return res;
}
private static int sum(int[] t) {
int res = 0;
for (int i = 0; i < t.length; i++) {
res = res + t[i];
}
return res;
}
}