ΠΠΈΡΡΠΈΠ½Π³ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
Π¦ΠΈΡΡΠΎΠ²Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ.
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΠΎΠ»ΡΡΠΎΠ½ΠΎΠ²ΠΎΠ΅ ΠΈ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠ΅
String outputDir = src. substring (0, indexOfFilename) + «»; Return step == commonStep? step: iterationStep (image, step); Public static void main (String args) throws IOException {. File outputGrayscaleFile = new File (outputGrayscalePath); System.out.println («use path to file as parameter»); Return grayscale == null? performGrayscale (): grayscale; For (int y = 0; y < originalRaster… Π§ΠΈΡΠ°ΡΡ Π΅ΡΡ >
ΠΠΈΡΡΠΈΠ½Π³ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π¦ΠΈΡΡΠΎΠ²Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ. ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΠΎΠ»ΡΡΠΎΠ½ΠΎΠ²ΠΎΠ΅ ΠΈ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠ΅ (ΡΠ΅ΡΠ΅ΡΠ°Ρ, ΠΊΡΡΡΠΎΠ²Π°Ρ, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½Π°Ρ)
ΠΠ»Π°Π²Π½ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ:
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Main {.
public static void main (String[] args) throws IOException {.
if (args.length < 1) {.
System.out.println («use path to file as parameter»);
return;
}.
String src = args[0];
int indexOfFilename = src. lastIndexOf (««) + 1;
String outputDir = src. substring (0, indexOfFilename) + «» ;
String[] filename = src. substring (indexOfFilename).split («.»);
String name = filename[0];
String ext = «.» + filename[1];
String grayscaleName = name + «_gray» + ext;
String binaryName = name + «_bin.bmp» ;
String outputGrayscalePath = outputDir + grayscaleName;
String outputBinaryPath = outputDir + binaryName;
File outputGrayscaleFile = new File (outputGrayscalePath);
File outputBinaryFile = new File (outputBinaryPath);
BufferedImage original = ImageIO. read (new File (src));
Performer performer = Performer. create (original);
BufferedImage grayscale = performer. grayscale ();
BufferedImage binary = performer. binary ();
ImageIO.write (grayscale, «jpg», outputGrayscaleFile);
ImageIO.write (binary, «bmp», outputBinaryFile);
}.
}.
ΠΠ»Π°ΡΡ, ΠΎΡΠ²Π΅ΡΠ°ΡΡΠΈΠΉ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ:
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.util.ArrayList;
import java.util.List;
public class Performer {.
private BufferedImage image;
private BufferedImage grayscale;
private BufferedImage binary;
private Performer (BufferedImage image) {.
this.image = image;
}.
public static Performer create (BufferedImage image) {.
return new Performer (image);
}.
public BufferedImage grayscale () {.
return grayscale == null? performGrayscale (): grayscale;
}.
public BufferedImage binary () {.
return binary == null? performBinary (): binary;
}.
private BufferedImage performGrayscale () {.
grayscale = new BufferedImage (image.getWidth (), image. getHeight (),.
BufferedImage.TYPE_BYTE_GRAY);
WritableRaster raster = grayscale. getRaster ();
for (int x = 0; x < image. getWidth (); x++) {.
for (int y = 0; y < image. getHeight (); y++) {.
int rgb = image. getRGB (x, y);
Color c = new Color (rgb);
int r = c. getRed ();
int g = c. getGreen ();
int b = c. getBlue ();
int gray = (int) (r * 0.3 + g * 0.59 + b * 0.11);
raster.setPixel (x, y, new int[] { gray });
}.
}.
return grayscale;
}.
private BufferedImage performBinary () {.
int step = step (grayscale ());
int min = 0;
int max = 1;
Raster originalRaster = grayscale ().getData ();
binary = new BufferedImage (image.getWidth (), image. getHeight (),.
BufferedImage.TYPE_BYTE_BINARY);
WritableRaster resultRaster = binary. getRaster ();
for (int x = 0; x < originalRaster. getWidth (); x++) {.
for (int y = 0; y < originalRaster. getHeight (); y++) {.
int pix = originalRaster. getPixel (x, y, (int[]) null)[0];
if (pix < step) {.
resultRaster.setPixel (x, y, new int[] { min });
} else {.
resultRaster.setPixel (x, y, new int[] { max });
}.
}.
}.
return binary;
}.
private int step (BufferedImage image) {.
return iterationStep (image, commonStep (image));
}.
private int commonStep (BufferedImage image) {.
int min = 255;
int max = 0;
Raster raster = image. getData ();
for (int x = 0; x < raster. getWidth (); x++) {.
for (int y = 0; y < raster. getHeight (); y++) {.
int pix = raster. getPixel (x, y, (int[]) null)[0];
if (pix < min) {.
min = pix;
}.
if (pix > max) {.
max = pix;
}.
}.
}.
return (min + max) / 2;
}.
private int iterationStep (BufferedImage image, int commonStep) {.
List min = new ArrayList ();
List max = new ArrayList ();
Raster raster = image. getData ();
for (int x = 0; x < raster. getWidth (); x++) {.
for (int y = 0; y < raster. getHeight (); y++) {.
int pix = raster. getPixel (x, y, (int[]) null)[0];
if (pix >= commonStep) {.
max.add (pix);
} else {.
min.add (pix);
}.
}.
}.
int step = (average (min) + average (max)) / 2;
return step == commonStep? step: iterationStep (image, step);
}.
private int average (List list) {.
int result = 0;
for (Integer pix: list) {.
result += pix;
}.
return list. size () == 0? 0: result / list. size ();
}.
}.
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠΎΠ·Π΄Π°ΡΡΡΡ 2 ΡΠ°ΠΉΠ»Π° (ΠΏΠΎΠ»ΡΡΠΎΠ½ΠΎΠ²ΠΎΠ΅ ΠΈ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠ΅).