package com.akjava.gwt.lib.client.experimental.lbp;
public class BinaryPattern {
/**
* TODO support separate splitX,splitY
* only support 8 bit base
*
* @param data must be [y][x]
* @param split
* @param edgeX
* @param edgeY
* @return 8bit x split x split
*/
public static int[] dataToBinaryPattern(int[][] data,int split,int edgeX,int edgeY){
return dataToBinaryPattern(data,split,split,edgeX,edgeY);
}
public static int[] dataToBinaryPattern(int[][] data,int splitW,int splitH,int edgeX,int edgeY){
int volOff=0;
//old version i have no idea why *2 ,edge contain both side
//int w=(data.length-edgeX*2)/split;
//int h=(data[0].length-edgeY*2)/split;
//minus useless edge pixel and divided split
int w=(data[0].length-edgeX)/splitW;
int h=(data.length-edgeY)/splitH;
int size=splitW*splitH;
int[] retInt=new int[8*size];
for(int i=0;i<size;i++){
int histgram[]=new int[8];
int ox=i%splitW;
int oy=i/splitW;
//i feels these is wrong
//int offx=edgeX/2+ox;
//int offy=edgeY/2+oy*w;
int offx=edgeX/2+ox*w; //start with half-edge and divided-width x at
int offy=edgeY/2+oy*h;
for(int x=0;x<w;x++){
for(int y=0;y<h;y++){
String binary=Integer.toBinaryString(data[y+offy][x+offx]);
int length=binary.length()-1;
//System.out.println((x+offx)+","+(y+offy)+"="+binary);
for(int j=0;j<8;j++){
int at=length-j;
if(at>=0){
if(binary.charAt(j)=='1'){
histgram[at]++;
}
}else{
break;
}
}
}
}
for(int j=0;j<8;j++){
retInt[j+8*volOff]=histgram[j];
//vol.set(1, 1, i+8*volOff, histgram[i]);
}
volOff++;
}
return retInt;
}
public static int[] dataToBinaryPatternXY(int[][] data,int split,int edgeX,int edgeY){
int volOff=0;
//old version i have no idea why *2 ,edge contain both side
//int w=(data.length-edgeX*2)/split;
//int h=(data[0].length-edgeY*2)/split;
//minus useless edge pixel and divided split
int w=(data.length-edgeX)/split;
int h=(data[0].length-edgeY)/split;
int[] retInt=new int[8*split*split];
for(int i=0;i<split*split;i++){
int histgram[]=new int[8];
int ox=i%split;
int oy=i/split;
//i feels these is wrong
//int offx=edgeX/2+ox;
//int offy=edgeY/2+oy*w;
int offx=edgeX/2+ox*w; //start with half-edge and divided-width x at
int offy=edgeY/2+oy*h;
for(int x=0;x<w;x++){
for(int y=0;y<h;y++){
String binary=Integer.toBinaryString(data[x+offx][y+offy]);
int length=binary.length()-1;
//System.out.println((x+offx)+","+(y+offy)+"="+binary);
for(int j=0;j<8;j++){
int at=length-j;
if(at>=0){
if(binary.charAt(j)=='1'){
histgram[at]++;
}
}else{
break;
}
}
}
}
for(int j=0;j<8;j++){
retInt[j+8*volOff]=histgram[j];
//vol.set(1, 1, i+8*volOff, histgram[i]);
}
volOff++;
}
return retInt;
}
}