Add thresholding
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
package domain.image.processing.threshold;
|
||||
|
||||
import domain.image.GrayScaleMatrix;
|
||||
import domain.image.Image;
|
||||
|
||||
public class Thresholding {
|
||||
|
||||
public static GrayScaleMatrix simpleThreshold(
|
||||
Image image,
|
||||
int threshold
|
||||
) {
|
||||
GrayScaleMatrix gray = image.toGrayScale();
|
||||
|
||||
int height = gray.getHeight();
|
||||
int width = gray.getWidth();
|
||||
|
||||
double[][] data = gray.getRawData();
|
||||
double[][] result = new double[height][width];
|
||||
|
||||
for (int y = 0; y < height; y++) {
|
||||
for (int x = 0; x < width; x++) {
|
||||
result[y][x] = data[y][x] >= threshold
|
||||
? 255
|
||||
: 0;
|
||||
}
|
||||
}
|
||||
|
||||
return new GrayScaleMatrix(result);
|
||||
}
|
||||
|
||||
public static GrayScaleMatrix doubleThreshold(
|
||||
Image image,
|
||||
int threshold1,
|
||||
int threshold2
|
||||
) {
|
||||
if (threshold1 > threshold2) {
|
||||
int temp = threshold1;
|
||||
threshold1 = threshold2;
|
||||
threshold2 = temp;
|
||||
}
|
||||
|
||||
GrayScaleMatrix gray = image.toGrayScale();
|
||||
|
||||
int height = gray.getHeight();
|
||||
int width = gray.getWidth();
|
||||
|
||||
double[][] data = gray.getRawData();
|
||||
double[][] result = new double[height][width];
|
||||
|
||||
for (int y = 0; y < height; y++) {
|
||||
for (int x = 0; x < width; x++) {
|
||||
|
||||
double value = data[y][x];
|
||||
|
||||
if (value < threshold1) {
|
||||
result[y][x] = 0;
|
||||
} else if (value < threshold2) {
|
||||
result[y][x] = 127;
|
||||
} else {
|
||||
result[y][x] = 255;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new GrayScaleMatrix(result);
|
||||
}
|
||||
|
||||
public static GrayScaleMatrix automaticThreshold(Image image) {
|
||||
GrayScaleMatrix gray = image.toGrayScale();
|
||||
|
||||
double[][] data = gray.getRawData();
|
||||
|
||||
double threshold = (gray.getMinValue() + gray.getMaxValue()) / 2.0;
|
||||
|
||||
while (true) {
|
||||
double lowerSum = 0;
|
||||
double upperSum = 0;
|
||||
|
||||
int lowerCount = 0;
|
||||
int upperCount = 0;
|
||||
|
||||
for (int y = 0; y < gray.getHeight(); y++) {
|
||||
for (int x = 0; x < gray.getWidth(); x++) {
|
||||
|
||||
double value = data[y][x];
|
||||
|
||||
if (value <= threshold) {
|
||||
lowerSum += value;
|
||||
lowerCount++;
|
||||
} else {
|
||||
upperSum += value;
|
||||
upperCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (lowerCount == 0 || upperCount == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
double lowerMean = lowerSum / lowerCount;
|
||||
double upperMean = upperSum / upperCount;
|
||||
|
||||
double newThreshold = (lowerMean + upperMean) / 2.0;
|
||||
|
||||
if (Math.abs(newThreshold - threshold) < 0.5) {
|
||||
threshold = newThreshold;
|
||||
break;
|
||||
}
|
||||
|
||||
threshold = newThreshold;
|
||||
}
|
||||
|
||||
return simpleThreshold(image, (int) threshold);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user