Fix complex morphology
This commit is contained in:
@@ -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); }
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user