// Path: desktop/src/main/java/com/cv4j/core/datamodel/ByteProcessor.java
// public class ByteProcessor implements ImageProcessor {
//     private int width;
//     private int height;
// 
//     private byte[] GRAY;
//     private int[] hist;
//     private ImageData image;
// 
//     public ByteProcessor(int width, int height) {
//         this.width = width;
//         this.height = height;
//         this.GRAY = new byte[width*height];
//     }
//     
//     public ByteProcessor(byte[] data, int width, int height) {
//         this.width = width;
//         this.height = height;
//         this.GRAY = data;
//         // setup hist
//         hist = new int[256];
//         for(int i=0; i<data.length; i++) {
//             hist[data[i]&0xff]++;
//         }
//     }
// 
//     protected void setCallBack(ImageData data) {
//         this.image = data;
//     }
// 
//     @Override
//     public int getChannels() {
//         return 1;
//     }
// 
//     public void getPixel(int row, int col, byte[] rgb) {
//         int index = row*width + col;
//         if(rgb != null && rgb.length == 1) {
//             rgb[0] = GRAY[index];
//         }
//     }
// 
//     public byte[] getGray() {
//         return GRAY;
//     }
// 
//     public void putGray(byte[] gray) {
//         System.arraycopy(gray, 0, GRAY, 0, gray.length);
//     }
// 
//     public int[] histogram() {
//         return new int[0];
//     }
// 
//     public int[] getPixels() {
//         int size = width * height;
//         int[] pixels = new int[size];
//         for (int i=0; i < size; i++)
//             pixels[i] = 0xff000000 | ((GRAY[i]&0xff)<<16) | ((GRAY[i]&0xff)<<8) | GRAY[i]&0xff;
//         return pixels;
//     }
// 
//     @Override
//     public float[] toFloat(int index) {
//         float[] data = new float[GRAY.length];
//         for(int i=0; i<data.length; i++)
//             data[i] = GRAY[i]&0xff;
//         return data;
//     }
// 
//     @Override
//     public int[] toInt(int index) {
//         int[] data = new int[GRAY.length];
//         for(int i=0; i<data.length; i++)
//             data[i] = GRAY[i]&0xff;
//         return data;
//     }
// 
//     @Override
//     public byte[] toByte(int index) {
//         return GRAY;
//     }
// 
// 	@Override
// 	public int getWidth() {
// 		return width;
// 	}
// 
// 	@Override
// 	public int getHeight() {
// 		return height;
// 	}
// 
// 	@Override
// 	public ImageData getImage() {
// 
// 		return image;
// 	}
// 
// }


import com.cv4j.core.datamodel.ByteProcessor;
import java.util.Arrays;
				p6 = input[offset+width+col]&0xff;
				p7 = input[offset+width+col-1]&0xff;
				p8 = input[offset+col-1]&0xff;
				p9 = input[offset-width+col-1]&0xff;
				// match 1 - foreground, 0 - background
				p1 = (p1 == 255) ? 1 : 0;
				p2 = (p2 == 255) ? 1 : 0;
				p3 = (p3 == 255) ? 1 : 0;
				p4 = (p4 == 255) ? 1 : 0;
				p5 = (p5 == 255) ? 1 : 0;
				p6 = (p6 == 255) ? 1 : 0;
				p7 = (p7 == 255) ? 1 : 0;
				p8 = (p8 == 255) ? 1 : 0;
				p9 = (p9 == 255) ? 1 : 0;
				
				int con1 = p2+p3+p4+p5+p6+p7+p8+p9;

				StringBuilder sb = new StringBuilder();
				sb.append(String.valueOf(p2))
						.append(String.valueOf(p3))
						.append(String.valueOf(p4))
						.append(String.valueOf(p5))
						.append(String.valueOf(p6))
						.append(String.valueOf(p7))
						.append(String.valueOf(p8))
						.append(String.valueOf(p9))
						.append(String.valueOf(p2));

				String sequence = sb.toString();
				int index1 = sequence.indexOf("01");
// Path: desktop/src/main/java/com/cv4j/core/datamodel/ByteProcessor.java
// public class ByteProcessor implements ImageProcessor {
//     private int width;
//     private int height;
// 
//     private byte[] GRAY;
//     private int[] hist;
//     private ImageData image;
// 
//     public ByteProcessor(int width, int height) {
//         this.width = width;
//         this.height = height;
//         this.GRAY = new byte[width*height];
//     }
//     
//     public ByteProcessor(byte[] data, int width, int height) {
//         this.width = width;
//         this.height = height;
//         this.GRAY = data;
//         // setup hist
//         hist = new int[256];
//         for(int i=0; i<data.length; i++) {
//             hist[data[i]&0xff]++;
//         }
//     }
// 
//     protected void setCallBack(ImageData data) {
//         this.image = data;
//     }
// 
//     @Override
//     public int getChannels() {
//         return 1;
//     }
// 
//     public void getPixel(int row, int col, byte[] rgb) {
//         int index = row*width + col;
//         if(rgb != null && rgb.length == 1) {
//             rgb[0] = GRAY[index];
//         }
//     }
// 
//     public byte[] getGray() {
//         return GRAY;
//     }
// 
//     public void putGray(byte[] gray) {
//         System.arraycopy(gray, 0, GRAY, 0, gray.length);
//     }
// 
//     public int[] histogram() {
//         return new int[0];
//     }
// 
//     public int[] getPixels() {
//         int size = width * height;
//         int[] pixels = new int[size];
//         for (int i=0; i < size; i++)
//             pixels[i] = 0xff000000 | ((GRAY[i]&0xff)<<16) | ((GRAY[i]&0xff)<<8) | GRAY[i]&0xff;
//         return pixels;
//     }
// 
//     @Override
//     public float[] toFloat(int index) {
//         float[] data = new float[GRAY.length];
//         for(int i=0; i<data.length; i++)
//             data[i] = GRAY[i]&0xff;
//         return data;
//     }
// 
//     @Override
//     public int[] toInt(int index) {
//         int[] data = new int[GRAY.length];
//         for(int i=0; i<data.length; i++)
//             data[i] = GRAY[i]&0xff;
//         return data;
//     }
// 
//     @Override
//     public byte[] toByte(int index) {
//         return GRAY;
//     }
// 
// 	@Override
// 	public int getWidth() {
// 		return width;
// 	}
// 
// 	@Override
// 	public int getHeight() {
// 		return height;
// 	}
// 
// 	@Override
// 	public ImageData getImage() {
// 
// 		return image;
// 	}
// 
// }


// Path: desktop/src/main/java/com/cv4j/core/binary/ZhangSuenThin.java
import com.cv4j.core.datamodel.ByteProcessor;
import java.util.Arrays;

				p6 = input[offset+width+col]&0xff;
				p7 = input[offset+width+col-1]&0xff;
				p8 = input[offset+col-1]&0xff;
				p9 = input[offset-width+col-1]&0xff;
				// match 1 - foreground, 0 - background
				p1 = (p1 == 255) ? 1 : 0;
				p2 = (p2 == 255) ? 1 : 0;
				p3 = (p3 == 255) ? 1 : 0;
				p4 = (p4 == 255) ? 1 : 0;
				p5 = (p5 == 255) ? 1 : 0;
				p6 = (p6 == 255) ? 1 : 0;
				p7 = (p7 == 255) ? 1 : 0;
				p8 = (p8 == 255) ? 1 : 0;
				p9 = (p9 == 255) ? 1 : 0;
				
				int con1 = p2+p3+p4+p5+p6+p7+p8+p9;

				StringBuilder sb = new StringBuilder();
				sb.append(String.valueOf(p2))
						.append(String.valueOf(p3))
						.append(String.valueOf(p4))
						.append(String.valueOf(p5))
						.append(String.valueOf(p6))
						.append(String.valueOf(p7))
						.append(String.valueOf(p8))
						.append(String.valueOf(p9))
						.append(String.valueOf(p2));

				String sequence = sb.toString();
				int index1 = sequence.indexOf("01");
				int index2 = sequence.lastIndexOf("01");