1 全局Otus法
package binimage.binary;import binimage.utils.AbstractImageOptionFilter;import java.awt.image.BufferedImage;
import java.util.Arrays;public class OtusFilter extends AbstractImageOptionFilter {public static final double WEIGHT = 1.0 / 3.0;@Overridepublic BufferedImage process(BufferedImage image) {int width = image.getWidth();int height = image.getHeight();int[] pixels = new int[width * height];getRGB(image, 0, 0, width, height, pixels);int r = 0, g = 0, b = 0;int offset = 0;for (int row = 0; row < height; row++) {offset = row * width;for (int col = 0; col < width; col++) {r = (pixels[offset + col] >> 16) & 0xff;g = (pixels[offset + col] >> 8) & 0xff;b = (pixels[offset + col] & 0xff);int gray = (int) ((r + g + b) * WEIGHT);pixels[offset + col] = gray;}}otusThreshold(pixels, width, height);BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);setRGB(bi, 0, 0, width, height, pixels);return bi;}private void otusThreshold(int[] pixels, int width, int height) {int[] hist = new int[256];Arrays.fill(hist, 0);for (int i = 0; i < pixels.length; i++) {hist[pixels[i]]++;}double mindis = 100000000.0;int t = 255;for (int level = 0; level < 256; level++) {double[] bresult = calculateWMV(hist, level, pixels.length, true);double[] fresult = calculateWMV(hist, level, pixels.length, false);double innerdev = bresult[0] * bresult[2] + fresult[0] * fresult[2];if (innerdev < mindis) {mindis = innerdev;t = level;}}System.out.println("final threshold value : " + t);for (int i = 0; i < pixels.length; i++) {if (pixels[i] > t) {pixels[i] = (0xff << 24) | ((255 & 0xff) << 16) | ((255 & 0xff) << 8) | (255 & 0xff);} else {pixels[i] = (0xff << 24) | ((0 & 0xff) << 16) | ((0 & 0xff) << 8) | (0 & 0xff);}}}private double[] calculateWMV(int[] hist, int level, int total, boolean bg) {double weight = 0, means = 0, dev = 0;double sum = 0, count = 0;for (int l = 0; l < hist.length; l++) {if (bg) {if (level <= l) { sum += (l * hist[l]);count += hist[l];}} else {if (level > l) {sum += (l * hist[l]);count += hist[l];}}}weight = count / total;means = sum / count;sum = 0;for (int l = 0; l < hist.length; l++) {if (bg) {if (level <= l) {sum += ((l - means) * (l - means) * hist[l]);}} else {if (level > l) {sum += ((l - means) * (l - means) * hist[l]);}}}dev = sum / count;return new double[]{weight, means, dev};}}
public void process() {AbstractImageOptionFilter filter = new OtusFilter();resultImage = filter.process(this.image);}

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!