Fix complex morphology

This commit is contained in:
2026-09-29 03:53:27 +02:00
parent 9fcc48ecf5
commit ee7c1cab2f
17 changed files with 543 additions and 111 deletions

View File

@@ -52,6 +52,8 @@ public class NavPresenter {
public void goToBasicMorphology(){ navigator.showBasicMorphology(); }
public void goToComplexMorphology(){ navigator.showComplexMorphology(); }
public GrayScaleMatrix getImageGrayMatrix() { return appState.getImage().toGrayScale(); }
public void setMode(Mode mode) { modeService.setMode(mode); }

View File

@@ -2,7 +2,7 @@ package presenters.morphology;
import domain.image.Image;
public interface MorphologyListener {
public interface BasicMorphologyListener {
void onErosionChanged(Image image);
void onDilationChanged(Image image);
@@ -10,4 +10,6 @@ public interface MorphologyListener {
void onOpeningChanged(Image image);
void onClosingChanged(Image image);
}

View File

@@ -1,23 +1,23 @@
package presenters.morphology;
import app.state.AppState;
import app.state.MorphologyState;
import app.state.BasicMorphologyState;
import com.google.inject.Inject;
import domain.image.Image;
import services.MorphologyService;
import ui.abstractions.IBasicMorphologyView;
public class MorphologyPresenter implements MorphologyListener {
public class BasicMorphologyPresenter implements BasicMorphologyListener {
private final AppState appState;
private final MorphologyState morphologyState;
private final BasicMorphologyState morphologyState;
private final MorphologyService morphologyService;
private IBasicMorphologyView view;
@Inject
public MorphologyPresenter(
public BasicMorphologyPresenter(
AppState appState,
MorphologyState morphologyState,
BasicMorphologyState morphologyState,
MorphologyService morphologyService
) {
this.appState = appState;

View File

@@ -0,0 +1,10 @@
package presenters.morphology;
import domain.image.Image;
public interface ComplexMorphologyListener {
void onMaskChanged(Image mask);
void onGeodesicDilationChanged(Image image);
void onGeodesicReconstructionChanged(Image image);
void onMedianChanged(Image image);
}

View File

@@ -0,0 +1,126 @@
package presenters.morphology;
import app.state.AppState;
import app.state.ComplexMorphologyState;
import com.google.inject.Inject;
import domain.image.Image;
import services.MorphologyService;
import ui.abstractions.IComplexMorphologyView;
public class ComplexMorphologyPresenter implements ComplexMorphologyListener {
private final AppState appState;
private final ComplexMorphologyState morphologyState;
private final MorphologyService morphologyService;
private IComplexMorphologyView view;
@Inject
public ComplexMorphologyPresenter(
AppState appState,
ComplexMorphologyState morphologyState,
MorphologyService morphologyService
) {
this.appState = appState;
this.morphologyState = morphologyState;
this.morphologyService = morphologyService;
morphologyState.subscribe(this);
}
public void setView(IComplexMorphologyView view) {
this.view = view;
}
public void setMask(Image mask) {
this.morphologyState.setMask(mask);
}
public void computeGeodesicDilation(int iterations) {
Image image = appState.getImage();
Image mask = morphologyState.getMask();
Image result = morphologyService.geodesicDilation(image, mask, iterations);
morphologyState.setDilation(result);
}
public void computeGeodesicReconstruction() {
Image image = appState.getImage();
Image mask = morphologyState.getMask();
Image result = morphologyService.geodesicReconstruction(image, mask);
System.out.println("IMAGE: "
+ image.getWidth() + "x" + image.getHeight());
System.out.println("MASK: "
+ mask.getWidth() + "x" + mask.getHeight());
System.out.println(
"Same object? " + (image == mask)
);
System.out.println("Image : " + image.getPixel(0, 0).grayValue());
System.out.println("Mask : " + mask.getPixel(0, 0).grayValue());
System.out.println("Result : " + result.getPixel(0, 0).grayValue());
double[][] imageData = image.toGrayScale().getRawData();
double[][] maskData = mask.toGrayScale().getRawData();
int violations = 0;
for (int y = 0; y < image.getHeight(); y++) {
for (int x = 0; x < image.getWidth(); x++) {
if (imageData[y][x] > maskData[y][x]) {
violations++;
}
}
}
System.out.println("Marker > mask pixels: " + violations);
morphologyState.setReconstruction(result);
}
public void computeMedianFilter(int size) {
Image image = appState.getImage();
Image result = morphologyService.medianFilter(image, size);
morphologyState.setMedian(result);
}
public void dispose() {
view = null;
morphologyState.unsubscribe(this);
}
@Override
public void onMaskChanged(Image mask) {
}
@Override
public void onGeodesicDilationChanged(Image image) {
if (view != null) {
view.updateDilation(image);
}
}
@Override
public void onGeodesicReconstructionChanged(Image image) {
if (view != null) {
view.updateReconstruction(image);
}
}
@Override
public void onMedianChanged(Image image) {
if (view != null) {
view.updateMedian(image);
}
}
}