Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Image Processing Operations for ImageLab #11

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions imagelab_electron/imagelab-blocks.js
Original file line number Diff line number Diff line change
Expand Up @@ -931,6 +931,16 @@ Blockly.defineBlocksWithJsonArray([
"Thresholding is a method of image segmentation, in general it is used to create binary images. You can change the threshold value from the properties as well as you can assign a max value.",
helpUrl: "",
},
{
type: "clahe",
message0: "Apply CLAHE",
previousStatement: null,
nextStatement: null,
colour: 270,
tooltip:
"Contrast Limited Adaptive Histogram Equalization (CLAHE) is used to improve contrast of images",
helpUrl: "",
},
{
type: "border_for_all",
message0: "with thickness %1",
Expand Down
7 changes: 7 additions & 0 deletions imagelab_electron/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,13 @@
<block type="transformation_distance"></block>
<block type="transformation_laplacian"></block>
</category>
<category
css-icon="customIcon mdi mdi-sigma"
name="Miscellaneous"
colour="#5b40a5"
>
<block type="clahe"></block>
</category>
</xml>
</div>
</div>
Expand Down
1 change: 1 addition & 0 deletions imagelab_electron/operations.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ const PROCESS_OPERATIONS = {
MORPHOLOGICAL: "filtering_morphological",
ADAPTIVETHRESHOLDING: "thresholding_adaptivethreshold",
SIMPLETHRESHOLDING: "thresholding_applythreshold",
CLAHE: "clahe"
};

module.exports = PROCESS_OPERATIONS;
6 changes: 6 additions & 0 deletions imagelab_electron/src/controller/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ const RotateImage = require("../operator/geometric/RotateImage");
const ScaleImage = require("../operator/geometric/ScaleImage");
const AdaptiveThreshold = require("../operator/thresholding/AdaptiveThresholding");
const ApplyThreshold = require("../operator/thresholding/ApplyThreshold");
const CLAHE = require("../operator/miscellaneous/CLAHE");

class MainController {
// This private field is used to store the applied operators in the workspace
Expand Down Expand Up @@ -244,6 +245,11 @@ class MainController {
new ApplyThreshold(PROCESS_OPERATIONS.SIMPLETHRESHOLDING, id)
);
break;
case PROCESS_OPERATIONS.CLAHE:
this.#appliedOperators.push(
new CLAHE(PROCESS_OPERATIONS.CLAHE, id)
);
break;
default:
break;
}
Expand Down
31 changes: 31 additions & 0 deletions imagelab_electron/src/operator/miscellaneous/CLAHE.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
const OpenCvOperator = require("../OpenCvOperator");

/**
* This class contains the main logic
* of CLAHE processing of the image
*/
class CLAHE extends OpenCvOperator {
constructor(type, id) {
super(type, id);
}

/**
*
* @param {Mat Image} image
* @returns
* Computes CLAHE
* to the Processed Mat image
*/
compute(image) {
let equalDst = new this.cv2.Mat();
let claheDst = new this.cv2.Mat();
this.cv2.cvtColor(image, image, this.cv2.COLOR_RGBA2GRAY, 0);
this.cv2.equalizeHist(image, equalDst);
let tileGridSize = new this.cv2.Size(8, 8);
let clahe = new this.cv2.CLAHE(40, tileGridSize);
clahe.apply(image, claheDst);
return claheDst;
}
}

module.exports = CLAHE;
Original file line number Diff line number Diff line change
Expand Up @@ -538,7 +538,8 @@ public void initialize(URL url, ResourceBundle resourceBundle) {
// Populating blurringOperatorsContainer.
BlurringOperatorController.applyBlurEffectElement().element,
BlurringOperatorController.applyGaussianEffectElement().element,
BlurringOperatorController.applyMedainBlurEffectElement().element
BlurringOperatorController.applyMedainBlurEffectElement().element,
BlurringOperatorController.applyBilateralEffectElement().element
);

filteringOperatorsContainer.setSpacing(15d);
Expand Down Expand Up @@ -589,7 +590,8 @@ public void initialize(URL url, ResourceBundle resourceBundle) {
// Populating sobelDerivationContainer
MiscellaneousOperatorController.cannyEdgeDetectionElement().element,
MiscellaneousOperatorController.houghLineTransformElement().element,
MiscellaneousOperatorController.histogramEqualizationElement().element
MiscellaneousOperatorController.histogramEqualizationElement().element,
MiscellaneousOperatorController.WatershedAlgorithmElement().element
);
contourOperationContainer.setSpacing(15d);
contourOperationContainer.setAlignment(Pos.TOP_CENTER);
Expand All @@ -607,7 +609,8 @@ public void initialize(URL url, ResourceBundle resourceBundle) {
histogramOperationContainer.getChildren().addAll(
// Populating Histogram operators
HistogramController.histogramCalculationElement().element,
HistogramController.templateMatchingElement().element
HistogramController.templateMatchingElement().element,
HistogramController.claheElement().element
);
setDashboardToInitialState();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.imagelab.controllers;

import com.imagelab.component.OperatorUIElement;
import com.imagelab.operator.imagebluring.ApplyBilateralBlur;
import com.imagelab.operator.imagebluring.ApplyBlurEffect;
import com.imagelab.operator.imagebluring.ApplyGaussianBlurEffect;
import com.imagelab.operator.imagebluring.ApplyMedianBlurEffect;
import com.imagelab.view.AbstractInformationUI;
import com.imagelab.view.InformationContainerView;
import com.imagelab.view.forms.AbstractPropertiesForm;
import com.imagelab.view.forms.BilateralBlurPropertiesForm;
import com.imagelab.view.forms.GaussianBlurPropertiesForm;
import com.imagelab.view.forms.MedianBlurPropertiesForm;
import com.imagelab.view.forms.SimpleBlurPropertiesForm;
Expand Down Expand Up @@ -75,4 +77,25 @@ public AbstractPropertiesForm buildPropertiesFormUI() {
applyMedianBlurEffect.buildElement();
return applyMedianBlurEffect;
}
public static OperatorUIElement applyBilateralEffectElement() {
//applybilateralEffect UI element.
OperatorUIElement applybilateralBlur = new OperatorUIElement() {
@Override
public AbstractInformationUI buildInformationUI() {
return new InformationContainerView(ApplyBilateralBlur
.Information.OPERATOR_INFO.toString());
}

@Override
public AbstractPropertiesForm buildPropertiesFormUI() {
return new BilateralBlurPropertiesForm((ApplyBilateralBlur) this.operator);
}
};
applybilateralBlur.operator = new ApplyBilateralBlur();
applybilateralBlur.operatorId = ApplyBilateralBlur.class.getCanonicalName();
applybilateralBlur.operatorName = "APPLY-BILATERAL-BLUR";
applybilateralBlur.elementStyleId = "applyBilateralBlur";
applybilateralBlur.buildElement();
return applybilateralBlur;
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package com.imagelab.controllers;

import com.imagelab.component.OperatorUIElement;
import com.imagelab.operator.histogram.CLAHE;
import com.imagelab.operator.histogram.HistogramCalculation;
import com.imagelab.operator.histogram.TemplateMatching;
import com.imagelab.operator.transformation.LaplacianTransformation;
import com.imagelab.view.AbstractInformationUI;
import com.imagelab.view.InformationContainerView;
import com.imagelab.view.forms.AbstractPropertiesForm;
import com.imagelab.view.forms.ClahePropertiesForm;
import com.imagelab.view.forms.HistogramCalculationPropertiesForm;
import com.imagelab.view.forms.LaplacianTransformationPropertiesForm;
import com.imagelab.view.forms.TemplateMatchingPropertiesForm;

public class HistogramController {
Expand Down Expand Up @@ -54,4 +54,25 @@ public AbstractPropertiesForm buildPropertiesFormUI() {
templateMatching.buildElement();
return templateMatching;
}
public static OperatorUIElement claheElement() {
//CLAHE Controller Function
OperatorUIElement claheElement = new OperatorUIElement() {
@Override
public AbstractInformationUI buildInformationUI() {
return new InformationContainerView(CLAHE
.Information.OPERATOR_INFO.toString());
}

@Override
public AbstractPropertiesForm buildPropertiesFormUI() {
return new ClahePropertiesForm((CLAHE) this.operator);
}
};
claheElement.operator = new CLAHE();
claheElement.operatorId = CLAHE.class.getCanonicalName();
claheElement.operatorName = "CLAHE";
claheElement.elementStyleId = "clahe";
claheElement.buildElement();
return claheElement;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@
import com.imagelab.operator.miscellaneousoperators.CannyEdgeDetection;
import com.imagelab.operator.miscellaneousoperators.HistogramEqualization;
import com.imagelab.operator.miscellaneousoperators.HoughLineTransform;
import com.imagelab.operator.miscellaneousoperators.Watershed;
import com.imagelab.view.AbstractInformationUI;
import com.imagelab.view.InformationContainerView;
import com.imagelab.view.forms.AbstractPropertiesForm;
import com.imagelab.view.forms.CannyEdgeDetectionPropertiesForm;
import com.imagelab.view.forms.HistogramEqualizationPropertiesForm;
import com.imagelab.view.forms.HoughLineTransformPropertiesForm;
import com.imagelab.view.forms.WatershedPropertiesForm;


public class MiscellaneousOperatorController {
Expand Down Expand Up @@ -76,4 +78,25 @@ public AbstractPropertiesForm buildPropertiesFormUI() {
histogramEqualization.buildElement();
return histogramEqualization;
}
public static OperatorUIElement WatershedAlgorithmElement() {
//Histogram Equalization transform properties form.
OperatorUIElement watershedAlgorithmElement = new OperatorUIElement() {
@Override
public AbstractInformationUI buildInformationUI() {
return new InformationContainerView(Watershed
.Information.OPERATOR_INFO.toString());
}

@Override
public AbstractPropertiesForm buildPropertiesFormUI() {
return new WatershedPropertiesForm((Watershed) this.operator);
}
};
watershedAlgorithmElement.operator = new Watershed();
watershedAlgorithmElement.operatorId = Watershed.class.getCanonicalName();
watershedAlgorithmElement.operatorName = "WATERSHED";
watershedAlgorithmElement.elementStyleId = "watershed";
watershedAlgorithmElement.buildElement();
return watershedAlgorithmElement;
}
}
135 changes: 135 additions & 0 deletions imagelab_java/src/main/java/com/imagelab/operator/histogram/CLAHE.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
package com.imagelab.operator.histogram;

import com.imagelab.operator.OpenCVOperator;
import com.imagelab.operator.basic.ReadImage;
import com.imagelab.operator.basic.WriteImage;
import com.imagelab.operator.filtering.ApplyBilateralFilter;
import com.imagelab.operator.filtering.ApplyBoxFilter;
import com.imagelab.operator.filtering.ApplyDilation;
import com.imagelab.operator.filtering.ApplyFilter2D;
import com.imagelab.operator.filtering.ApplyImagePyramid;
import com.imagelab.operator.filtering.ApplyImagePyramidDown;
import com.imagelab.operator.filtering.ApplyMorphological;
import com.imagelab.operator.filtering.ApplySQRBoxFilter;
import com.imagelab.operator.geotransformation.ColorMaps;
import com.imagelab.operator.geotransformation.ImageAffine;
import com.imagelab.operator.geotransformation.ImageReflection;
import com.imagelab.operator.geotransformation.RotateImage;
import com.imagelab.operator.geotransformation.ScaleImage;
import com.imagelab.operator.imagebluring.ApplyBlurEffect;
import com.imagelab.operator.imagebluring.ApplyGaussianBlurEffect;
import com.imagelab.operator.imagebluring.ApplyMedianBlurEffect;
import com.imagelab.operator.imageconversion.ColoredImageToBinary;
import com.imagelab.operator.imageconversion.ConvertToGrayscale;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

/**
* Contrast Limited Adaptive Histogram Equalization (CLAHE) operator class which contains
* adding a filter to an image related
* functionalities.
*/
public class CLAHE extends OpenCVOperator {

/**
* This method contains the logic which validates the applicable
* openCV operations for a particular openCV operator.
*
* @param previous - accepts the previous operator to validate.
* @return - whether the received operator is valid or not.
*/
@Override
public boolean validate(OpenCVOperator previous) {
if (previous == null) {
return false;
}
return allowedOperators().contains(previous.getClass());
}

/**
* This method contains the openCV operator related specific logic.
*
* @param image - accepts the mat object processed from the previous steps.
* @return - processed computed Mat obj.
*/
@Override
public Mat compute(Mat image) {
return applyCLAHE(image);
}

/**
* This method contains the applicable openCV operator for the selected
* openCV operator.
*
* @return - applicable operator.
*/
@Override
public Set<Class<?>> allowedOperators() {
Set<Class<?>> allowed = new HashSet<>();
allowed.add(ReadImage.class);
allowed.add(WriteImage.class);
allowed.add(ImageReflection.class);
allowed.add(RotateImage.class);
allowed.add(ColorMaps.class);
allowed.add(ImageAffine.class);
allowed.add(ScaleImage.class);
allowed.add(ColoredImageToBinary.class);
allowed.add(ConvertToGrayscale.class);
allowed.add(ApplyBlurEffect.class);
allowed.add(ApplyGaussianBlurEffect.class);
allowed.add(ApplyMedianBlurEffect.class);
allowed.add(ApplyBoxFilter.class);
allowed.add(ApplyBilateralFilter.class);
allowed.add(ApplyImagePyramidDown.class);
allowed.add(ApplyImagePyramid.class);
allowed.add(ApplyDilation.class);
allowed.add(ApplyFilter2D.class);
allowed.add(ApplySQRBoxFilter.class);
allowed.add(ApplyMorphological.class);
return allowed;
}

/**
* This method contains applying clahe filter related
* opencv logic.
*
* @param imageFile - source mat image.
* @return - clahe applied mat image.
*/
private Mat applyCLAHE(Mat imageFile) {
// Creating an empty matrix to store the result
Mat image = new Mat();

List<Mat> channels = new LinkedList();
Core.split(imageFile, channels);
org.opencv.imgproc.CLAHE clahe = Imgproc.createCLAHE();
clahe.apply(channels.get(0), image);

return image;
}

/**
* Information related to the CLAHE operator.
*/
public enum Information {
/**
* Operator information in string format.
*/
OPERATOR_INFO {
/**
* @return - Operator information and name of the operator.
*/
public String toString() {
return "CLAHE\n\nThis operations allows"
+ "you to apply Contrast Limited Adaptive Histogram Equalization"
+ "to your image";
}
}
}
}
Loading