Commit b9ad45ab by Tobias

initial commit

1 parent e63e3c4b
Showing 72 changed files with 4913 additions and 1 deletions
/bin/
/target/
.settings/
.classpath
.project
.project.swp
## Exclude latex auxiliary files
*.aux
*.toc
*.out
*.log
*.lof
*.ind
*.ilg
*.idx
*.fls
*.synctex.gz
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
Stegosuite
\ No newline at end of file
=Stegosuite=
Before you work, please always ensure to do: git pull
#NOTE: This is an internal implementation file, its format can be changed without prior notice.
#Mon Jun 01 20:16:52 CEST 2015
org.swtchart-0.9.0.jar>=
org.swtchart-0.9.0.pom>=
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.swtchart</groupId>
<artifactId>org.swtchart</artifactId>
<version>0.9.0</version>
<description>POM was created from install:install-file</description>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>org.swtchart</groupId>
<artifactId>org.swtchart</artifactId>
<versioning>
<release>0.9.0</release>
<versions>
<version>0.9.0</version>
</versions>
<lastUpdated>20150601181652</lastUpdated>
</versioning>
</metadata>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="2">
<profile kind="CleanUpProfile" name="ACS Clean Up" version="2">
<setting id="cleanup.format_source_code" value="true"/>
<setting id="cleanup.convert_functional_interfaces" value="false"/>
<setting id="cleanup.add_missing_annotations" value="true"/>
<setting id="cleanup.use_this_for_non_static_method_access_only_if_necessary" value="true"/>
<setting id="cleanup.remove_unused_private_types" value="false"/>
<setting id="cleanup.insert_inferred_type_arguments" value="false"/>
<setting id="cleanup.qualify_static_member_accesses_through_instances_with_declaring_class" value="true"/>
<setting id="cleanup.qualify_static_method_accesses_with_declaring_class" value="false"/>
<setting id="cleanup.add_generated_serial_version_id" value="true"/>
<setting id="cleanup.make_variable_declarations_final" value="false"/>
<setting id="cleanup.add_missing_methods" value="false"/>
<setting id="cleanup.always_use_this_for_non_static_field_access" value="false"/>
<setting id="cleanup.use_type_arguments" value="false"/>
<setting id="cleanup.remove_trailing_whitespaces_ignore_empty" value="true"/>
<setting id="cleanup.correct_indentation" value="true"/>
<setting id="cleanup.never_use_parentheses_in_expressions" value="true"/>
<setting id="cleanup.add_serial_version_id" value="true"/>
<setting id="cleanup.remove_unused_private_methods" value="false"/>
<setting id="cleanup.use_this_for_non_static_field_access" value="true"/>
<setting id="cleanup.use_blocks_only_for_return_and_throw" value="false"/>
<setting id="cleanup.remove_unused_private_members" value="false"/>
<setting id="cleanup.add_missing_override_annotations_interface_methods" value="true"/>
<setting id="cleanup.remove_trailing_whitespaces_all" value="false"/>
<setting id="cleanup.make_type_abstract_if_missing_method" value="false"/>
<setting id="cleanup.always_use_this_for_non_static_method_access" value="false"/>
<setting id="cleanup.remove_unnecessary_nls_tags" value="true"/>
<setting id="cleanup.format_source_code_changes_only" value="false"/>
<setting id="cleanup.qualify_static_field_accesses_with_declaring_class" value="false"/>
<setting id="cleanup.add_missing_nls_tags" value="false"/>
<setting id="cleanup.use_this_for_non_static_field_access_only_if_necessary" value="true"/>
<setting id="cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class" value="true"/>
<setting id="cleanup.remove_unnecessary_casts" value="true"/>
<setting id="cleanup.qualify_static_member_accesses_with_declaring_class" value="true"/>
<setting id="cleanup.use_parentheses_in_expressions" value="false"/>
<setting id="cleanup.remove_unused_private_fields" value="false"/>
<setting id="cleanup.make_parameters_final" value="false"/>
<setting id="cleanup.remove_redundant_type_arguments" value="true"/>
<setting id="cleanup.remove_trailing_whitespaces" value="true"/>
<setting id="cleanup.remove_unused_imports" value="true"/>
<setting id="cleanup.use_anonymous_class_creation" value="false"/>
<setting id="cleanup.organize_imports" value="true"/>
<setting id="cleanup.sort_members" value="false"/>
<setting id="cleanup.remove_private_constructors" value="false"/>
<setting id="cleanup.convert_to_enhanced_for_loop" value="true"/>
<setting id="cleanup.always_use_blocks" value="true"/>
<setting id="cleanup.never_use_blocks" value="false"/>
<setting id="cleanup.use_lambda" value="true"/>
<setting id="cleanup.always_use_parentheses_in_expressions" value="false"/>
<setting id="cleanup.use_this_for_non_static_method_access" value="true"/>
<setting id="cleanup.remove_unused_local_variables" value="false"/>
<setting id="cleanup.make_private_fields_final" value="true"/>
<setting id="cleanup.add_missing_deprecated_annotations" value="true"/>
<setting id="cleanup.add_default_serial_version_id" value="false"/>
<setting id="cleanup.sort_members_all" value="false"/>
<setting id="cleanup.use_blocks" value="true"/>
<setting id="cleanup.add_missing_override_annotations" value="true"/>
<setting id="cleanup.make_local_variable_final" value="true"/>
</profile>
</profiles>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>stegosuite</groupId>
<artifactId>stegosuite</artifactId>
<version>0.9</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<sourceDirectory>src</sourceDirectory>
<resources>
<resource>
<directory>resources</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.4.0</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>org.stegosuite.Stegosuite</mainClass>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>org.stegosuite.Stegosuite</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>${swt.groupId}</groupId>
<artifactId>${swt.artifactId}</artifactId>
<version>4.5</version>
</dependency>
<dependency>
<groupId>org.swtchart</groupId>
<artifactId>org.swtchart</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-math3</artifactId>
<version>3.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.12</version>
</dependency>
</dependencies>
<profiles>
<profile>
<id>linux</id>
<activation>
<os>
<family>Linux</family>
<arch>amd64</arch>
</os>
</activation>
<properties>
<swt.groupId>org.eclipse.swt</swt.groupId>
<swt.artifactId>org.eclipse.swt.gtk.linux.x86_64</swt.artifactId>
</properties>
</profile>
<profile>
<id>win64</id>
<activation>
<os>
<family>Windows</family>
<arch>amd64</arch>
</os>
</activation>
<properties>
<swt.groupId>org.eclipse.swt</swt.groupId>
<swt.artifactId>org.eclipse.swt.win32.win32.x86_64</swt.artifactId>
</properties>
</profile>
<profile>
<id>mac64</id>
<activation>
<os>
<family>mac os x</family>
<arch>amd64</arch>
</os>
</activation>
<properties>
<swt.groupId>org.eclipse.swt</swt.groupId>
<swt.artifactId>org.eclipse.swt.cocoa.macosx.x86_64</swt.artifactId>
</properties>
</profile>
</profiles>
<repositories>
<repository>
<id>maven-local</id>
<name>local-maven-repo</name>
<url>file://${project.basedir}/maven-repo</url>
</repository>
<repository>
<id>swt-maven-repo</id>
<url>http://maven-eclipse.github.io/maven</url>
</repository>
</repositories>
</project>
\ No newline at end of file
No preview for this file type
log4j.rootLogger=debug, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%-5p] %l - %m%n
package org.stegosuite;
import org.stegosuite.ui.Gui;
public class Stegosuite {
public static void main(String[] args) {
new Gui();
}
}
package org.stegosuite.image.analysis;
import org.apache.commons.math3.stat.inference.ChiSquareTest;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.RGB;
/**
*
* Chi-Square attack, described in : Attacks on Steganographic Systems Andreas
* Westfeld and Andreas Pfitzmann
*
* Only works for sequential embedding or very high (>99%) embedding rates.
*
* Sources: https://github.com/b3dk7/StegExpose
* https://github.com/Nesh108/simple-steganalysis-suite
*
* More info: http://www.guillermito2.net/stegano/tools/index.html
* http://cuneytcaliskan
* .blogspot.fr/2011/12/steganalysis-chi-square-attack-lsb.html
*
*/
public class ChiSquare {
public static double[] chiSquareAttackTopToBottom(ImageData image) {
int csSize = 1024;
int nbBlocks = ((3 * image.width * image.height) / csSize) - 1;
double[] x = new double[nbBlocks];
double[] chi = new double[nbBlocks];
int width = image.width;
int height = image.height;
int block = 0;
int nbBytes = 1;
int[] values = new int[256];
double[] expectedValues = new double[128];
long[] pov = new long[128];
RGB rgb;
for (int i = 0; i < values.length; i++) {
values[i] = 1;
x[i] = i;
}
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
rgb = image.palette.getRGB(image.getPixel(i, j));
if (block < chi.length) {
values[rgb.red]++;
nbBytes++;
if (nbBytes > csSize) {
for (int k = 0; k < expectedValues.length; k++) {
expectedValues[k] = (values[2 * k] + values[2 * k + 1]) / (double) 2;
pov[k] = values[2 * k];
}
chi[block] = new ChiSquareTest().chiSquareTest(expectedValues, pov);
block++;
nbBytes = 1;
/*for(int m=0; m<values.length; m++)
{
values[m] = 1;
}*/
}
}
if (block < chi.length) {
values[rgb.green]++;
nbBytes++;
if (nbBytes > csSize) {
for (int k = 0; k < expectedValues.length; k++) {
expectedValues[k] = (values[2 * k] + values[2 * k + 1]) / (double) 2;
pov[k] = values[2 * k];
}
chi[block] = new ChiSquareTest().chiSquareTest(expectedValues, pov);
block++;
nbBytes = 1;
/*for(int m=0; m<values.length; m++)
{
values[m] = 1;
}*/
}
}
if (block < chi.length) {
values[rgb.blue]++;
nbBytes++;
if (nbBytes > csSize) {
for (int k = 0; k < expectedValues.length; k++) {
expectedValues[k] = (values[2 * k] + values[2 * k + 1]) / 2;
pov[k] = values[2 * k];
}
chi[block] = new ChiSquareTest().chiSquareTest(expectedValues, pov);
block++;
nbBytes = 1;
/*for(int m=0; m<values.length; m++)
{
values[m] = 1;
}*/
}
}
}
}
double csQuant = 0;
for (double csVal : chi)
csQuant += csVal;
double cs = steralize(csQuant / chi.length); //chi-square-propability
// make zeros visible in the diagram
for (int i = 0; i < chi.length; i++) {
if (chi[i] == 0) {
chi[i] += 0.001;
}
}
return chi;
}
private static double steralize(double x) {
x = Math.abs(x);
if (x > 1)
return 1;
return x;
}
}
package org.stegosuite.image.analysis;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.RGB;
public class LsbVisualization {
public static ImageData calculate(ImageData imageData) {
int pixel;
int pixel2;
ImageData imageDataLsb = (ImageData) imageData.clone();
for (int y = 0; y < imageData.height; y++) {
for (int x = 0; x < imageData.width; x++) {
pixel = imageData.getPixel(x, y);
RGB rgb = imageData.palette.getRGB(pixel);
if ((rgb.red & 0x01) == 1) {
rgb.red = 255;
} else
rgb.red = 0;
if ((rgb.green & 0x01) == 1) {
rgb.green = 255;
} else
rgb.green = 0;
if ((rgb.blue & 0x01) == 1) {
rgb.blue = 255;
} else
rgb.blue = 0;
pixel2 = imageData.palette.getPixel(rgb);
imageDataLsb.setPixel(x, y, pixel2);
}
}
return imageDataLsb;
}
}
package org.stegosuite.image.analysis;
import java.awt.Color;
import java.util.TreeSet;
import org.eclipse.swt.graphics.ImageData;
/**
* Neighbourhood histogram attacks.
*
* Only works for BMP images.
*
* Sources:
* http://simple-steganalysis-suite.googlecode.com/svn/wiki/articles/
* Reliable_Detection_of_LSB_Steganography_Based_on_the_Difference_Image_Histogram
* .pdf
* https://github.com/Nesh108/simple-steganalysis-suite
*
*/
public class NeighbourhoodHistogram {
/**
* Method to actual perform the attack.
*
* @param imageData The image to be analyzed
* @return The values of the histogram
*/
public static double[] attack(ImageData imageData) {
// We use a TreeSet to speed up the attack.
TreeSet<Node> colorTree = new TreeSet<Node>();
int width = imageData.width;
int height = imageData.height;
double[] y = new double[27]; // Up to 26 neighbour colours and the 0 is there.
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
Color actualColor = new Color(imageData.getPixel(i, j));
colorTree.add(new Node(actualColor.getRed(), actualColor.getGreen(), actualColor.getBlue()));
}
}
int count = 0;
for (Node n : colorTree) {
if (colorTree.contains(new Node(n.r - 1, n.g - 1, n.b - 1)))
count++;
if (colorTree.contains(new Node(n.r - 1, n.g - 1, n.b)))
count++;
if (colorTree.contains(new Node(n.r - 1, n.g - 1, n.b + 1)))
count++;
if (colorTree.contains(new Node(n.r - 1, n.g, n.b - 1)))
count++;
if (colorTree.contains(new Node(n.r - 1, n.g, n.b)))
count++;
if (colorTree.contains(new Node(n.r - 1, n.g, n.b + 1)))
count++;
if (colorTree.contains(new Node(n.r - 1, n.g + 1, n.b - 1)))
count++;
if (colorTree.contains(new Node(n.r - 1, n.g + 1, n.b)))
count++;
if (colorTree.contains(new Node(n.r - 1, n.g + 1, n.b + 1)))
count++;
if (colorTree.contains(new Node(n.r, n.g - 1, n.b - 1)))
count++;
if (colorTree.contains(new Node(n.r, n.g - 1, n.b)))
count++;
if (colorTree.contains(new Node(n.r, n.g - 1, n.b + 1)))
count++;
if (colorTree.contains(new Node(n.r, n.g, n.b - 1)))
count++;
if (colorTree.contains(new Node(n.r, n.g, n.b + 1)))
count++;
if (colorTree.contains(new Node(n.r, n.g + 1, n.b - 1)))
count++;
if (colorTree.contains(new Node(n.r, n.g + 1, n.b)))
count++;
if (colorTree.contains(new Node(n.r, n.g + 1, n.b + 1)))
count++;
if (colorTree.contains(new Node(n.r + 1, n.g - 1, n.b - 1)))
count++;
if (colorTree.contains(new Node(n.r + 1, n.g - 1, n.b)))
count++;
if (colorTree.contains(new Node(n.r + 1, n.g - 1, n.b + 1)))
count++;
if (colorTree.contains(new Node(n.r + 1, n.g, n.b - 1)))
count++;
if (colorTree.contains(new Node(n.r + 1, n.g, n.b)))
count++;
if (colorTree.contains(new Node(n.r + 1, n.g, n.b + 1)))
count++;
if (colorTree.contains(new Node(n.r + 1, n.g + 1, n.b - 1)))
count++;
if (colorTree.contains(new Node(n.r + 1, n.g + 1, n.b)))
count++;
if (colorTree.contains(new Node(n.r + 1, n.g + 1, n.b + 1)))
count++;
y[count]++;
count = 0;
}
return y;
}
/**
* Get the mean value of the values in the histogram.
*
* @param y Values of the histogram
* @return Mean of the values contained in {@code y}
*/
public static double getMean(double y[]) {
double average = 0;
double total = 0;
for(int i = 0; i < y.length; i++) {
average += i*y[i];
total += y[i];
}
return (average/total);
}
/**
* Inner class to represent a node of the tree set used in the attack.
*
*/
private static class Node
implements Comparable<Node> {
// Attributes of the class
int r;
int g;
int b;
/**
* Constructor of the object Node.
* @param red Red value represented as {@code int}.
* @param g Red value represented as {@code int}.
* @param b Blue value represented as {@code int}
*/
public Node(int red, int green, int blue) {
r = red;
g = green;
b = blue;
}
@Override
public int compareTo(Node n) {
if (this.r != n.r) {
return this.r - n.r;
} else if (this.g != n.g) {
return this.g - n.g;
} else if (this.b != n.b) {
return this.b - n.b;
} else
return 0;
}
}
}
package org.stegosuite.image.analysis;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.RGB;
/**
* Difference image histogram attack
*
* Sources:
* http://simple-steganalysis-suite.googlecode.com/svn/wiki/articles/
* Reliable_Detection_of_LSB_Steganography_Based_on_the_Difference_Image_Histogram
* .pdf
* https://github.com/Nesh108/simple-steganalysis-suite
*
*/
public class PixelsDifferenceHistogram {
/**
* Method to actual perform the attack.
*
* @param imageData Image to be analyzed.
* @return The values of the histogram
*/
public static double[] attack(ImageData imageData) {
int height = imageData.height;
int width = imageData.width;
double[] values = new double[511]; // 255 positives, 255 negatives and 0
for (int i = 0; i < height; i++) {
for (int j = 0; j < width && (j + 1) < width; j += 2) {
RGB rgb = imageData.palette.getRGB(imageData.getPixel(j, i));
int red = rgb.red;
int green = rgb.green;
int blue = rgb.blue;
RGB rgbPlusOne = imageData.palette.getRGB(imageData.getPixel(j + 1, i));
int redPlusOne = rgbPlusOne.red;
int greenPlusOne = rgbPlusOne.green;
int bluePlusOne = rgbPlusOne.blue;
// Add 255 because of the negative values
values[red - redPlusOne + 255]++;
values[green - greenPlusOne + 255]++;
values[blue - bluePlusOne + 255]++;
}
}
return values;
}
}
package org.stegosuite.image.analysis;
import java.io.File;
import javax.imageio.IIOException;
import org.eclipse.swt.graphics.ImageData;
import org.stegosuite.image.format.BMPImage;
import org.stegosuite.image.format.GIFImage;
import org.stegosuite.image.util.ColorDistance;
import org.stegosuite.model.exception.SteganoImageException;
/**
* Pairs of values histogram attack, as presented in the first lecture of the
* project.
*/
public class PovHistogram {
// Attributes of the class
private static double[] lsbZero = new double[8];
private static double[] lsbOne = new double[8];
private static double[] means = new double[8];
/**
* Adapts the image for the attack. In particular if the image is a GIF the
* palette is sorted before the analysis.
* @param path Path of the image to be analyzed.
* @return The image to be analyzed.
* @throws SteganoImageException
* @throws IIOException
*/
public static ImageData adaptedImageData(String path) throws SteganoImageException, IIOException {
if (path.toLowerCase().endsWith("bmp")) {
BMPImage bmpImage = new BMPImage();
bmpImage.load(new File(path));
return bmpImage.getImageData();
} else if (path.toLowerCase().endsWith("gif")) {
GIFImage gifImage = new GIFImage();
gifImage.load(new File(path));
gifImage.setColorTable(gifImage.getSortedColorTable(ColorDistance.CIEDE_2000));
return gifImage.getImageData();
} else return null;
}
/**
* Method to actual perform the attack and fill the attributes of the class
* with the computed values.
* @param imgData The image to be analyzed.
*/
public static void attack(ImageData imgData) {
int count0000 = 0;
int count0001 = 0;
int count0010 = 0;
int count0011 = 0;
int count0100 = 0;
int count0101 = 0;
int count0110 = 0;
int count0111 = 0;
int count1000 = 0;
int count1001 = 0;
int count1010 = 0;
int count1011 = 0;
int count1100 = 0;
int count1101 = 0;
int count1110 = 0;
int count1111 = 0;
byte[] pixelsReferences = imgData.data;
for (int i = 0; i < pixelsReferences.length; i++) {
switch (pixelsReferences[i] & 0b00001111) {
case 0: count0000++; break;
case 1: count0001++; break;
case 2: count0010++; break;
case 3: count0011++; break;
case 4: count0100++; break;
case 5: count0101++; break;
case 6: count0110++; break;
case 7: count0111++; break;
case 8: count1000++; break;
case 9: count1001++; break;
case 10: count1010++; break;
case 11: count1011++; break;
case 12: count1100++; break;
case 13: count1101++; break;
case 14: count1110++; break;
case 15: count1111++; break;
default: break;
}
}
means[0] = computeMean(count0000, count0001);
means[1] = computeMean(count0010, count0011);
means[2] = computeMean(count0100, count0101);
means[3] = computeMean(count0110, count0111);
means[4] = computeMean(count1000, count1001);
means[5] = computeMean(count1010, count1011);
means[6] = computeMean(count1100, count1101);
means[7] = computeMean(count1110, count1111);
lsbZero[0] = count0000;
lsbZero[1] = count0010;
lsbZero[2] = count0100;
lsbZero[3] = count0110;
lsbZero[4] = count1000;
lsbZero[5] = count1010;
lsbZero[6] = count1100;
lsbZero[7] = count1110;
lsbOne[0] = count0001;
lsbOne[1] = count0011;
lsbOne[2] = count0101;
lsbOne[3] = count0111;
lsbOne[4] = count1001;
lsbOne[5] = count1011;
lsbOne[6] = count1101;
lsbOne[7] = count1111;
}
/**
* Get the amount of values with LSB = 0.
* @return Table with the amount of values with LSB = 0
*/
public static double[] getLsbZero() {
return lsbZero;
}
/**
* Get the amount of values with LSB = 1.
* @return Table with the amount of values with LSB = 1.
*/
public static double[] getLsbOne() {
return lsbOne;
}
/**
* Get the means between the values with LSB = 0 and LSB = 1.
* @return Table with the means between the values with LSB = 0 and LSB = 1.
*/
public static double[] getMeans() {
return means;
}
/**
* Compute the mean between two {@code int}.
* @param n First number.
* @param m Second number.
* @return Mean between the two numbers.
*/
private static double computeMean(int n, int m) {
return (n + m)/2;