VolumeDerivedData* VolumeHistogramIntensity::createFrom(const VolumeBase* handle) const { tgtAssert(handle, "no volume handle"); VolumeHistogramIntensity* h = new VolumeHistogramIntensity(); Histogram1D hist = createHistogram1DFromVolume(handle, 256); h->hist_ = hist; return h; }
void VolumeInformation::computeInformation() { if (!volume_.hasData()) { numVoxels_.set(0); numSignificant_.set(0); minValue_.set(0.f); maxValue_.set(0.f); meanValue_.set(0.f); standardDeviation_.set(0.f); entropy_.set(0.f); return; } const VolumeRAM* volume = volume_.getData()->getRepresentation<VolumeRAM>(); tgtAssert(volume, "No input volume"); size_t numVoxels = volume->getNumVoxels(); tgt::vec2 intensityRange = volume->elementRange(); numVoxels_.setMaxValue(static_cast<int>(numVoxels)); numVoxels_.set(static_cast<int>(numVoxels)); numSignificant_.setMaxValue(static_cast<int>(numVoxels)); numSignificant_.set(static_cast<int>(VolumeOperatorNumSignificant::APPLY_OP(volume_.getData()))); // compute the entropy of the volume // E(H) = -\sum_{i=0}^{K-1}{H_p(i) \log_2(H_p(i)} // with H_p(i): normalized histrogram with intensity value i int histMax = tgt::iround(intensityRange.y); // handle float data as if it was 16 bit to prevent overflow histMax = tgt::clamp(histMax, 0, 1<<16);//TODO Histogram1D histogram = createHistogram1DFromVolume(volume_.getData(), histMax); double entropy = 0.0; for (size_t i = 0; i < static_cast<size_t>(histMax); ++i) { uint64_t value = histogram.getBucket(static_cast<int>(i)); if (value == 0) continue; double hi = static_cast<double>(value) / static_cast<double>(numVoxels); double loghi = log(hi); entropy += hi * loghi; } entropy *= -1; entropy_.setMaxValue(intensityRange.y); entropy_.set(static_cast<float>(entropy)); // min value minValue_.setMinValue(intensityRange.x); minValue_.setMaxValue(intensityRange.y); //minValue_.set(static_cast<float>(histogram.getSignificantRange().x)); float min = volume_.getData()->getDerivedData<VolumeMinMax>()->getMinNormalized(); minValue_.set(min); //max value maxValue_.setMinValue(intensityRange.x); maxValue_.setMaxValue(intensityRange.y); //maxValue_.set(static_cast<float>(histogram.getSignificantRange().y)); float max = volume_.getData()->getDerivedData<VolumeMinMax>()->getMaxNormalized(); maxValue_.set(max); // mean value double mean = 0.0; for (size_t i = 0; i < numVoxels; ++i) { float value = volume->getVoxelNormalized(i); mean += value; } mean /= numVoxels; meanValue_.setMinValue(intensityRange.x); meanValue_.setMaxValue(intensityRange.y); meanValue_.set(static_cast<float>(mean)); // variance double variance = 0.0; for (size_t i = 0; i < numVoxels; ++i) { float value = volume->getVoxelNormalized(i); variance += pow(static_cast<double>(value) - mean, 2.0); } variance /= numVoxels; standardDeviation_.setMaxValue(intensityRange.y); standardDeviation_.set(static_cast<float>(sqrt(variance))); }
VolumeHistogramIntensity::VolumeHistogramIntensity(const VolumeBase* vol, int bucketCount) : hist_(createHistogram1DFromVolume(vol, bucketCount)) { }