Currently job artifacts in CI/CD pipelines on LRZ GitLab never expire. Starting from Wed 26.1.2022 the default expiration time will be 30 days (GitLab default). Currently existing artifacts in already completed jobs will not be affected by the change. The latest artifacts for all jobs in the latest successful pipelines will be kept. More information: https://gitlab.lrz.de/help/user/admin_area/settings/continuous_integration.html#default-artifacts-expiration

Commit c6e9b3ac authored by schultezub's avatar schultezub
Browse files

Further work on Advanced US Fusion module

git-svn-id: https://camplinux.in.tum.de/svn/campvis/trunk@425 bb408c1c-ae56-11e1-83d9-df6b3e0c105e
parent a89b5e15
...@@ -63,7 +63,6 @@ namespace campvis { ...@@ -63,7 +63,6 @@ namespace campvis {
_comboBox->setCurrentIndex(prop->getValue()); _comboBox->setCurrentIndex(prop->getValue());
_comboBox->blockSignals(false); _comboBox->blockSignals(false);
_comboBox->blockSignals(false);
} }
void OptionPropertyWidget::onComboBoxIndexChanged(int value) { void OptionPropertyWidget::onComboBoxIndexChanged(int value) {
......
...@@ -37,22 +37,42 @@ out vec4 out_Color; ...@@ -37,22 +37,42 @@ out vec4 out_Color;
#include "tools/transferfunction.frag" #include "tools/transferfunction.frag"
uniform Texture3D _usImage; uniform Texture3D _usImage;
uniform Texture3D _blurredImage;
uniform Texture3D _confidenceMap; uniform Texture3D _confidenceMap;
uniform Texture3D _gradientMap; uniform Texture3D _gradientMap;
uniform TransferFunction1D _transferFunction; uniform TransferFunction1D _transferFunction;
uniform int _sliceNumber; uniform int _sliceNumber;
uniform int _viewIndex;
uniform float _blurredScaling;
void main() { void main() {
vec3 texCoord = vec3(ex_TexCoord.xy, _usImage._sizeRCP.z * (_sliceNumber + 0.5)); vec3 texCoord = vec3(ex_TexCoord.xy, _usImage._sizeRCP.z * (_sliceNumber + 0.5));
vec4 texel = getElement3DNormalized(_usImage, texCoord); vec4 texel = getElement3DNormalized(_usImage, texCoord);
vec4 blurred = getElement3DNormalized(_blurredImage, texCoord) * _blurredScaling;
vec4 gradient = getElement3DNormalized(_gradientMap, texCoord); vec4 gradient = getElement3DNormalized(_gradientMap, texCoord);
float confidence = getElement3DNormalized(_confidenceMap, texCoord).a; float confidence = getElement3DNormalized(_confidenceMap, texCoord).a;
out_Color = lookupTF(_transferFunction, texel.a); switch (_viewIndex) {
case 0:
vec3 hsv = rgb2hsv(out_Color.xyz); out_Color = lookupTF(_transferFunction, texel.a);
hsv.y = 1.0 - confidence; break;
out_Color.xyz = hsv2rgb(hsv); case 1:
out_Color = lookupTF(_transferFunction, blurred.a);
break;
case 2:
out_Color = lookupTF(_transferFunction, texel.a + texel.a - blurred.a);
break;
case 3:
out_Color = lookupTF(_transferFunction, texel.a);
vec3 hsv = rgb2hsv(out_Color.xyz);
hsv.y = 1.0 - confidence;
out_Color.xyz = hsv2rgb(hsv);
break;
case 4:
float intensity = mix(blurred.a, 2.0 * texel.a - blurred.a, confidence);
out_Color = lookupTF(_transferFunction, intensity);
break;
}
} }
...@@ -79,9 +79,12 @@ namespace campvis { ...@@ -79,9 +79,12 @@ namespace campvis {
_usFusion.p_targetImageID.setValue("us.fused"); _usFusion.p_targetImageID.setValue("us.fused");
_usFusion.p_sliceNumber.setValue(0); _usFusion.p_sliceNumber.setValue(0);
_usFusion.p_view.setValue(0);
_usFilter.p_targetImageID.setValue("us.filtered"); _usFilter.p_targetImageID.setValue("us.filtered");
_usFilter.p_targetImageID.connect(&_usFusion.p_blurredImageId);
_usFilter.p_filterMode.selectById("gauss"); _usFilter.p_filterMode.selectById("gauss");
_usFilter.p_sigma.setValue(4.f);
// TODO: replace this hardcoded domain by automatically determined from image min/max values // TODO: replace this hardcoded domain by automatically determined from image min/max values
Geometry1DTransferFunction* tf = new Geometry1DTransferFunction(128, tgt::vec2(0.f, 1.f)); Geometry1DTransferFunction* tf = new Geometry1DTransferFunction(128, tgt::vec2(0.f, 1.f));
......
...@@ -44,22 +44,36 @@ ...@@ -44,22 +44,36 @@
namespace campvis { namespace campvis {
const std::string AdvancedUsFusion::loggerCat_ = "CAMPVis.modules.vis.AdvancedUsFusion"; const std::string AdvancedUsFusion::loggerCat_ = "CAMPVis.modules.vis.AdvancedUsFusion";
GenericOption<std::string> viewOptions[5] = {
GenericOption<std::string>("us", "Ultrasound Only"),
GenericOption<std::string>("smoothed", "Smoothed US Only"),
GenericOption<std::string>("sharpened", "Sharpened US Only"),
GenericOption<std::string>("mappingSaturation", "Mapping Uncertainty to Saturation"),
GenericOption<std::string>("mappingSharpness", "Mapping Uncertainty to Sharpness")
};
AdvancedUsFusion::AdvancedUsFusion(GenericProperty<tgt::ivec2>& canvasSize) AdvancedUsFusion::AdvancedUsFusion(GenericProperty<tgt::ivec2>& canvasSize)
: VisualizationProcessor(canvasSize) : VisualizationProcessor(canvasSize)
, p_usImageId("UsImageId", "Ultrasound Input Image", "", DataNameProperty::READ) , p_usImageId("UsImageId", "Ultrasound Input Image", "", DataNameProperty::READ)
, p_blurredImageId("BlurredImageId", "Blurred Ultrasound Image", "", DataNameProperty::READ)
, p_gradientImageID("GradientImageId", "Gradient Input Image", "", DataNameProperty::READ) , p_gradientImageID("GradientImageId", "Gradient Input Image", "", DataNameProperty::READ)
, p_confidenceImageID("ConfidenceImageId", "Confidence Map Input", "", DataNameProperty::READ) , p_confidenceImageID("ConfidenceImageId", "Confidence Map Input", "", DataNameProperty::READ)
, p_targetImageID("targetImageID", "Output Image", "", DataNameProperty::WRITE) , p_targetImageID("targetImageID", "Output Image", "", DataNameProperty::WRITE)
, p_sliceNumber("sliceNumber", "Slice Number", 0, 0, 0) , p_sliceNumber("sliceNumber", "Slice Number", 0, 0, 0)
, p_transferFunction("transferFunction", "Transfer Function", new SimpleTransferFunction(256)) , p_transferFunction("transferFunction", "Transfer Function", new SimpleTransferFunction(256))
, p_view("View", "Image to Render", viewOptions, 5)
, p_blurredScaling("BlurredScaling", "Scaling for blurred image intensity", 1.f, .001f, 1000.f)
, _shader(0) , _shader(0)
{ {
addProperty(&p_usImageId); addProperty(&p_usImageId);
addProperty(&p_blurredImageId);
addProperty(&p_gradientImageID); addProperty(&p_gradientImageID);
addProperty(&p_confidenceImageID); addProperty(&p_confidenceImageID);
addProperty(&p_targetImageID); addProperty(&p_targetImageID);
addProperty(&p_sliceNumber); addProperty(&p_sliceNumber);
addProperty(&p_transferFunction); addProperty(&p_transferFunction);
addProperty(&p_view);
addProperty(&p_blurredScaling);
decoratePropertyCollection(this); decoratePropertyCollection(this);
} }
...@@ -82,10 +96,11 @@ namespace campvis { ...@@ -82,10 +96,11 @@ namespace campvis {
void AdvancedUsFusion::process(DataContainer& data) { void AdvancedUsFusion::process(DataContainer& data) {
ImageRepresentationGL::ScopedRepresentation img(data, p_usImageId.getValue()); ImageRepresentationGL::ScopedRepresentation img(data, p_usImageId.getValue());
ImageRepresentationGL::ScopedRepresentation blurred(data, p_blurredImageId.getValue());
ImageRepresentationGL::ScopedRepresentation confidence(data, p_confidenceImageID.getValue()); ImageRepresentationGL::ScopedRepresentation confidence(data, p_confidenceImageID.getValue());
ImageRepresentationGL::ScopedRepresentation gradients(data, p_gradientImageID.getValue()); ImageRepresentationGL::ScopedRepresentation gradients(data, p_gradientImageID.getValue());
if (img != 0 && gradients != 0 && confidence != 0) { if (img != 0 && blurred != 0 && gradients != 0 && confidence != 0) {
if (img->getDimensionality() == 3) { if (img->getDimensionality() == 3) {
if (img.getDataHandle().getTimestamp() != _sourceImageTimestamp) { if (img.getDataHandle().getTimestamp() != _sourceImageTimestamp) {
// source DataHandle has changed // source DataHandle has changed
...@@ -98,9 +113,12 @@ namespace campvis { ...@@ -98,9 +113,12 @@ namespace campvis {
_shader->activate(); _shader->activate();
decorateRenderProlog(data, _shader); decorateRenderProlog(data, _shader);
_shader->setUniform("_sliceNumber", p_sliceNumber.getValue()); _shader->setUniform("_sliceNumber", p_sliceNumber.getValue());
_shader->setUniform("_viewIndex", p_view.getValue());
_shader->setUniform("_blurredScaling", p_blurredScaling.getValue());
tgt::TextureUnit usUnit, confidenceUnit, gradientUnit, tfUnit; tgt::TextureUnit usUnit, blurredUnit, confidenceUnit, gradientUnit, tfUnit;
img->bind(_shader, usUnit, "_usImage"); img->bind(_shader, usUnit, "_usImage");
blurred->bind(_shader, blurredUnit, "_blurredImage");
confidence->bind(_shader, confidenceUnit, "_confidenceMap"); confidence->bind(_shader, confidenceUnit, "_confidenceMap");
gradients->bind(_shader, gradientUnit, "_gradientMap"); gradients->bind(_shader, gradientUnit, "_gradientMap");
p_transferFunction.getTF()->bind(_shader, tfUnit); p_transferFunction.getTF()->bind(_shader, tfUnit);
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "core/properties/datanameproperty.h" #include "core/properties/datanameproperty.h"
#include "core/properties/genericproperty.h" #include "core/properties/genericproperty.h"
#include "core/properties/numericproperty.h" #include "core/properties/numericproperty.h"
#include "core/properties/optionproperty.h"
#include "core/properties/transferfunctionproperty.h" #include "core/properties/transferfunctionproperty.h"
namespace tgt { namespace tgt {
...@@ -76,12 +77,15 @@ namespace campvis { ...@@ -76,12 +77,15 @@ namespace campvis {
virtual void process(DataContainer& data); virtual void process(DataContainer& data);
DataNameProperty p_usImageId; ///< image ID for input image DataNameProperty p_usImageId; ///< image ID for input image
DataNameProperty p_blurredImageId;
DataNameProperty p_gradientImageID; DataNameProperty p_gradientImageID;
DataNameProperty p_confidenceImageID; DataNameProperty p_confidenceImageID;
DataNameProperty p_targetImageID; ///< image ID for output image DataNameProperty p_targetImageID; ///< image ID for output image
IntProperty p_sliceNumber; ///< number of the slice to extract IntProperty p_sliceNumber; ///< number of the slice to extract
TransferFunctionProperty p_transferFunction; ///< Transfer function TransferFunctionProperty p_transferFunction; ///< Transfer function
GenericOptionProperty<std::string> p_view;
FloatProperty p_blurredScaling;
protected: protected:
/// adapts the range of the p_sliceNumber property to the image /// adapts the range of the p_sliceNumber property to the image
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include <itkSobelEdgeDetectionImageFilter.h> #include <itkSobelEdgeDetectionImageFilter.h>
#include <itkGradientAnisotropicDiffusionImageFilter.h> #include <itkGradientAnisotropicDiffusionImageFilter.h>
#include <itkCurvatureAnisotropicDiffusionImageFilter.h> #include <itkCurvatureAnisotropicDiffusionImageFilter.h>
#include <itkLaplacianSharpeningImageFilter.h>
#include "tbb/include/tbb/tbb.h" #include "tbb/include/tbb/tbb.h"
...@@ -179,12 +180,13 @@ ...@@ -179,12 +180,13 @@
namespace campvis { namespace campvis {
static const GenericOption<std::string> filterModes[5] = { static const GenericOption<std::string> filterModes[6] = {
GenericOption<std::string>("median", "Median"), GenericOption<std::string>("median", "Median"),
GenericOption<std::string>("gauss", "Gauss"), GenericOption<std::string>("gauss", "Gauss"),
GenericOption<std::string>("sobel", "Sobel"), GenericOption<std::string>("sobel", "Sobel"),
GenericOption<std::string>("gradientDiffusion", "Gradient Anisotropic Diffusion"), GenericOption<std::string>("gradientDiffusion", "Gradient Anisotropic Diffusion"),
GenericOption<std::string>("curvatureDiffusion", "Curvature Anisotropic Diffusion") GenericOption<std::string>("curvatureDiffusion", "Curvature Anisotropic Diffusion"),
GenericOption<std::string>("laplacianSharpening", "Laplacian Sharpening")
}; };
const std::string ItkImageFilter::loggerCat_ = "CAMPVis.modules.classification.ItkImageFilter"; const std::string ItkImageFilter::loggerCat_ = "CAMPVis.modules.classification.ItkImageFilter";
...@@ -193,7 +195,7 @@ namespace campvis { ...@@ -193,7 +195,7 @@ namespace campvis {
: AbstractProcessor() : AbstractProcessor()
, p_sourceImageID("InputVolume", "Input Volume ID", "volume", DataNameProperty::READ) , p_sourceImageID("InputVolume", "Input Volume ID", "volume", DataNameProperty::READ)
, p_targetImageID("OutputGradients", "Output Gradient Volume ID", "gradients", DataNameProperty::WRITE) , p_targetImageID("OutputGradients", "Output Gradient Volume ID", "gradients", DataNameProperty::WRITE)
, p_filterMode("FilterMode", "Filter Mode", filterModes, 5, InvalidationLevel::INVALID_RESULT | InvalidationLevel::INVALID_PROPERTIES) , p_filterMode("FilterMode", "Filter Mode", filterModes, 6, InvalidationLevel::INVALID_RESULT | InvalidationLevel::INVALID_PROPERTIES)
, p_kernelSize("KernelSize", "Kernel Size", 3, 3, 15) , p_kernelSize("KernelSize", "Kernel Size", 3, 3, 15)
, p_sigma("Sigma", "Sigma", 1.f, .1f, 10.f) , p_sigma("Sigma", "Sigma", 1.f, .1f, 10.f)
, p_numberOfSteps("NumberOfSteps", "Number of Steps", 5, 1, 15) , p_numberOfSteps("NumberOfSteps", "Number of Steps", 5, 1, 15)
...@@ -251,7 +253,9 @@ namespace campvis { ...@@ -251,7 +253,9 @@ namespace campvis {
filter->SetConductanceParameter(p_conductance.getValue()); \ filter->SetConductanceParameter(p_conductance.getValue()); \
); );
} }
else if (p_filterMode.getOptionValue() == "laplacianSharpening") {
DISPATCH_ITK_FILTER(input, LaplacianSharpeningImageFilter, /* nothing here */);
}
data.addData(p_targetImageID.getValue(), id); data.addData(p_targetImageID.getValue(), id);
p_targetImageID.issueWrite(); p_targetImageID.issueWrite();
} }
...@@ -278,7 +282,7 @@ namespace campvis { ...@@ -278,7 +282,7 @@ namespace campvis {
p_timeStep.setVisible(false); p_timeStep.setVisible(false);
p_conductance.setVisible(false); p_conductance.setVisible(false);
} }
else if (p_filterMode.getOptionValue() == "sobel") { else if (p_filterMode.getOptionValue() == "sobel" || p_filterMode.getOptionValue() == "laplacianSharpening") {
p_kernelSize.setVisible(false); p_kernelSize.setVisible(false);
p_sigma.setVisible(false); p_sigma.setVisible(false);
p_numberOfSteps.setVisible(false); p_numberOfSteps.setVisible(false);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment