diff --git a/src/main/java/presenters/UseCasePresenter.java b/src/main/java/presenters/UseCasePresenter.java index 834250e..5ff1fcf 100644 --- a/src/main/java/presenters/UseCasePresenter.java +++ b/src/main/java/presenters/UseCasePresenter.java @@ -40,7 +40,7 @@ public class UseCasePresenter { Image image1 = loadImage(NOISE_1_IMAGE); Image image2 = loadImage(NOISE_2_IMAGE); - Image reduced1 = measureTime("Reduction 1", () -> service.reduceNoise(image1, 0.5f, 7)); + Image reduced1 = measureTime("Reduction 1", () -> service.reduceNoise(image1, 1f, 7)); Image reduced2 = measureTime("Reduction 2", () -> service.reduceNoise(image2, 1f, 5)); Image[] results = { reduced1, reduced2 }; @@ -81,7 +81,7 @@ public class UseCasePresenter { public void computeToastOutline() { Image image = loadImage(TOAST_IMAGE); - Image result = service.detectToastContours(image); + Image result = measureTime("Toast outlines", () -> service.detectToastContours(image)); view.updateToastContours(result); } diff --git a/src/main/java/services/UseCaseService.java b/src/main/java/services/UseCaseService.java index df60b8c..c934ef4 100644 --- a/src/main/java/services/UseCaseService.java +++ b/src/main/java/services/UseCaseService.java @@ -119,7 +119,30 @@ public class UseCaseService { } public Image detectToastContours(Image image) { - return extractToastContours(image); + Image smoothed = BasicMorphology.opening(image, 3).toImage(); + GrayScaleMatrix dilated = BasicMorphology.dilation(smoothed, 3); + GrayScaleMatrix eroded = BasicMorphology.erosion(smoothed, 3); + double[][] dilatedData = dilated.getRawData(); + double[][] erodedData = eroded.getRawData(); + double[][] contours = new double[image.getHeight()][image.getWidth()]; + + for (int y = 0; y < image.getHeight(); y++) { + for (int x = 0; x < image.getWidth(); x++) { + contours[y][x] = dilatedData[y][x] - erodedData[y][x]; + } + } + + Image binaryContours = Thresholding.simpleThreshold(new GrayScaleMatrix(contours).toImage(), 40).toImage(); + + for (int y = 0; y < image.getHeight(); y++) { + for (int x = 0; x < image.getWidth(); x++) { + if (binaryContours.getPixel(x, y).grayValue() > 0) { + image.setPixelColor(x, y, 0, 255, 0); + } + } + } + + return image; } private Image equalizeRgb(Image image) {