you need a difference filter:
1) you calculate the horizontal difference (here you will have vertical segments)
2) you calculate the vertical difference (here, the horizontal segments)
3) you OR two cards, finding the contours
4) recreate the Bitmap object if you want to do this
something like (EDITED):
int[] pixels; int width = yourbitmap.getWidth(); int height = yourbitmap.getHeight(); yourbitmap.getPixels(pixels, 0, width, 0, 0, width, height); // transform grayscale int[] image = new int[width*height]; for (int y=0; y<height; y++) for (int x=0; x<width; x++) { int pixel = image[y*width + x]; image[y*width + x] = (Color.red(pixel) + Color.green(pixel) + Color.blue(pixel))/3; } // calculate diff_x (vertical segments) int[] dx = new int[width*height]; for (int y=0; y<height; y++) for (int x=0; x<width; x++) dx[y*width + x] = (x==0 || y== 0 ? 0 : Math.abs(image[y*width + x] - image[y*width + x-1])); // calculate diff_y (horizontal segments) int[] dy = new int[width*height]; for (int y=0; y<height; y++) for (int x=0; x<width; x++) dy[y*width + x] = (x==0 || y== 0 ? 0 : Math.abs(image[y*width+x] - image[(y-1)*width+x])); // when the color intensity is higher than THRESHOLD, accept segment // you'll want a slider to change THRESHOLD values bool[] result = new bool[width*height]; const int THRESHOLD = 60; // adjust this value for (int y=0; y<height; y++) for (int x=0; x<width; x++) result[y*width + x] = (dx[y*width + x] > THRESHOLD || dy[y*width + x] > THRESHOLD); Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); for (int y=0; y<height; y++) for (int x=0; x<width; x++) result.setPixel(x, y, result[y*width+x]? Color.Black : Color.White);
source share