package ajpeg;
import java.io.*;
import java.math.*;
public class Ajpeg {
static double m[][]={{48,39,40,68,60,38,50,121},{149,82,79,101,113,106,27,62},{58,63,77,69,124,107,74,125},{80,97,74,54,59,71,91,66},{18,34,33,46,64,61,32,37},{149,108,80,106,116,61,73,92},{211,233,159,88,107,158,161,109},{212,104,40,44,71,136,113,66}};
static int n[] = new int[64];
static int e1[] = new int[128];
/*
* Flow contol
* */
public static void main(String args[])throws IOException
{
getinput();
System.out.println("\n\n\n Input");
display();
//DCT
System.out.println("\n\n\n On DCT");
dct();
display();
//Quantization
System.out.println("\n\n\n On Quant");
quant();
display();
//zigzag
zigzag();
//entropy
se1();
}
/*
* Get initial input
* */
public static void getinput() throws IOException
{
BufferedReader obj = new BufferedReader (new InputStreamReader(System.in));
//System.out.println("Enter input matrix");
// m = new double[8][8];
//for(int i=0;i<8;i++)
// for(int j=0;j<8;j++)
// {
// m[i][j] = Integer.parseInt(obj.readLine());
// }
}
public static void display(){
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
{
System.out.print(m[i][j] + "\t");
if(j==7){ System.out.println();}
}
}
//DCT
public static void dct()
{
int i,j,u,v;
double res;
double temp[][] = new double[8][8];
//outer
for(u=0;u<8;u++)
{
for(v=0;v<8;v++)
{
res = 0;
//inner
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
res = res + (m[i][j]*Math.cos(Math.PI*(2*i+1)*u/16)*Math.cos(Math.PI*(2*j+1)*v/16));
}
}
res = res * 1/4;
if(u==0)
{
res = res / Math.sqrt(2);
}
else
{
//
}
if(v==0)
{
res = res / Math.sqrt(2);
}
else
{
//
}
temp[u][v] = res;
}
}
m = temp;
}
//Quantization
public static void quant()
{
double qt[][] = {{16,11,12,16,24,40,51,61},{12,12,14,19,26,58,60,55},{14,13,16,24,40,57,69,56},{14,17,22,29,51,87,80,62},{18,22,37,56,68,109,103,77},{24,35,55,64,81,104,113,92},{49,64,78,87,103,121,120,101},{72,92,95,98,112,110,103,99}};
for(int i=0;i<8;i++)
for(int j=0;j<8;j++){
m[i][j]=m[i][j]/qt[i][j];
m[i][j] = Math.round(m[i][j]);
}
}
//zigzag
public static void zigzag()
{
n[0] = (int)m[0][0];
n[1] = (int)m[0][1];
n[2]=(int)m[1][0];
n[3]=(int)m[2][0];
n[4] = (int)m[1][1];
n[5] = (int)m[0][2];
n[6]=(int)m[0][3];
n[7]=(int)m[1][2];
n[8]=(int)m[2][1];
n[9]=(int)m[3][0];
n[10]=(int)m[4][0];
n[11]=(int)m[3][1];
n[12]=(int)m[2][2];
n[13]=(int)m[1][3];
n[14]=(int)m[0][4];
n[15]=(int)m[0][5];
n[16]=(int)m[1][4];
n[17]=(int)m[2][3];
n[18]=(int)m[3][2];
n[19]=(int)m[4][1];
n[20]=(int)m[5][0];
n[21]=(int)m[6][0];
n[22]=(int)m[5][1];
n[23]=(int)m[4][2];
n[24]=(int)m[3][3];
n[25]=(int)m[2][4];
n[26]=(int)m[1][5];
n[27]=(int)m[0][6];
n[28]=(int)m[0][7];
n[29]=(int)m[1][6];
n[30]=(int)m[2][5];
n[31]=(int)m[3][4];
n[32]=(int)m[4][3];
n[33]=(int)m[5][2];
n[34]=(int)m[6][1];
n[35]=(int)m[7][0];
n[36]=(int)m[7][1];
n[37]=(int)m[6][2];
n[38]=(int)m[5][3];
n[39]=(int)m[4][4];
n[40]=(int)m[3][5];
n[41]=(int)m[2][6];
n[42]=(int)m[1][7];
n[43]=(int)m[2][7];
n[44]=(int)m[3][6];
n[45]=(int)m[4][5];
n[46]=(int)m[5][4];
n[47]=(int)m[6][3];
n[48]=(int)m[7][2];
n[49]=(int)m[7][3];
n[50]=(int)m[6][4];
n[51]=(int)m[5][5];
n[52]=(int)m[4][6];
n[53]=(int)m[3][7];
n[54]=(int)m[4][7];
n[55]=(int)m[5][6];
n[56]=(int)m[6][5];
n[57]=(int)m[7][4];
n[58]=(int)m[7][5];
n[59]=(int)m[6][6];
n[60]=(int)m[5][7];
n[61]=(int)m[6][7];
n[62]=(int)m[7][6];
n[63]=(int)m[7][7];
int i;
System.out.println("\n\n\n On zigzag");
for(i=0;i<64;i++)
{
n[i] = Math.abs(n[i]);
System.out.print(n[i]+"\t");
}
}
public static void se1()
{
int i,tp;
StringBuffer op = new StringBuffer();
for(i=0;i<64;i++){
int count =0;
tp = i;
while(i+1<64 && n[i+1]==0){
count++;
i++;
}
//op.append("(");
if(i!=0)
{
//append zero count only for ac
op.append(Integer.toBinaryString(count));
}
//op.append(" ");
//Get the number of bits required to represent that number in binary
op.append(Integer.toBinaryString(Integer.toBinaryString(n[tp]).length()));
//op.append(" ");
//Representing that number in binary
op.append(Integer.toBinaryString(n[tp]));
//op.append(" ");
}
String opt = op.toString();
System.out.println("\n\n\n"+opt);
}
}
/*
run:
Input
48.0 39.0 40.0 68.0 60.0 38.0 50.0 121.0
149.0 82.0 79.0 101.0 113.0 106.0 27.0 62.0
58.0 63.0 77.0 69.0 124.0 107.0 74.0 125.0
80.0 97.0 74.0 54.0 59.0 71.0 91.0 66.0
18.0 34.0 33.0 46.0 64.0 61.0 32.0 37.0
149.0 108.0 80.0 106.0 116.0 61.0 73.0 92.0
211.0 233.0 159.0 88.0 107.0 158.0 161.0 109.0
212.0 104.0 40.0 44.0 71.0 136.0 113.0 66.0
On DCT
699.2499999999999 43.17537783517842 55.2458962644029 72.11192252561607 24.000000000000046 -25.50537751002191 11.211754811037084 -4.1361934819846775
-129.78397283623318 -71.4957835348326 -70.25934416341046 -73.35229687341331 59.432585562295756 -24.0223298746278 22.614760810882366 -2.0506659449800475
85.70740770894031 30.32177947343959 61.776911934581165 44.86638463520262 14.844230984030151 17.348004771994926 15.510407640085607 -13.193489866474044
-40.809000772948515 10.166167106402561 -17.52558849075414 -55.805100649235996 30.50000746240999 -2.279391113997457 -21.002352160175203 -1.256783994741201
-157.49999999999997 -49.39469576644716 13.267753314920942 -1.7801066852396144 -8.749999999999988 22.468610979498212 -8.472261916064841 -9.234812991136668
92.48938318084393 -9.0274872527208 45.72009525326298 -48.1304191876491 -58.505400504935224 -9.012918835424449 -28.5397689145109 10.37937054199913
-53.090043923635406 -62.968866490330015 -3.4895923599144885 -19.62162006305608 56.08886972022844 -2.2530070591154256 -3.2769119345812876 11.912750023395063
-20.538618492594377 -55.90169401863137 -20.586885431597857 -18.190873560968313 -26.57556076417692 -27.068025625951428 8.472705090576747 0.3138030194931717
On Quant
44.0 4.0 5.0 5.0 1.0 -1.0 0.0 0.0
-11.0 -6.0 -5.0 -4.0 2.0 0.0 0.0 0.0
6.0 2.0 4.0 2.0 0.0 0.0 0.0 0.0
-3.0 1.0 -1.0 -2.0 1.0 0.0 0.0 0.0
-9.0 -2.0 0.0 0.0 0.0 0.0 0.0 0.0
4.0 0.0 1.0 -1.0 -1.0 0.0 0.0 0.0
-1.0 -1.0 0.0 0.0 1.0 0.0 0.0 0.0
0.0 -1.0 0.0 0.0 0.0 0.0 0.0 0.0
On zigzag
44 4 11 6 6 5 5 5 2 3 9 1 4 4 1 1 2 2 1 2 4 1 0 0 2 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
1101011000111000100101101111001111001110101110101110101010010110100100101101110001110001101101010010100110101001110010111101010111011111111111111111110111
BUILD SUCCESSFUL (total time: 0 seconds)
*/
Related