in src/wsiToDcm.cpp [310:454]
std::unique_ptr<SlideLevelDim> WsiToDcm::getSlideLevelDim(int64_t downsample,
SlideLevelDim *priorLevel) {
int32_t levelToGet;
bool readOpenslide = false;
std::string sourceDerivationDescription = "";
/*
DICOM requires uniform pixel spacing across downsampled image
for pixel spacing based metrics to produce images with compatiable
coordinate systems across zoom levels.
Downsampled acquistions can have in image dimensions which are
non-interger multiples of the highest magnification. Example: Aperio svs
imaging, E.g. (40x -> 10x reports the 10x image has having a
downsampling factor of 4.00018818010427. This results in non-uniform
scaling of the pixels and can result in small, but signifcant
mis-alignment in the downsampled imageing. Flooring, the multiplier
returned by openslide_get_level_downsample corrects this by restoring
consistent downsamping and pixel spacing across the image.
*/
std::unique_ptr<SlideLevelDim> slideLevelDim;
slideLevelDim = std::make_unique<SlideLevelDim>();
double multiplicator, downsampleOfLevel;
int64_t sourceLevelWidth, sourceLevelHeight;
bool generateFromPrimarySource = true;
bool readFromTiff = false;
if ((tiffFile_ != nullptr && tiffFile_->isInitalized()) &&
((downsample == 1 &&
wsiRequest_->SVSImportPreferScannerTileingForLargestLevel) ||
wsiRequest_->SVSImportPreferScannerTileingForAllLevels)) {
sourceLevelWidth = largestSlideLevelWidth_ / downsample;
sourceLevelHeight = largestSlideLevelHeight_ / downsample;
levelToGet = tiffFile_->getDirectoryIndexMatchingImageDimensions(
sourceLevelWidth, sourceLevelHeight);
if (levelToGet != -1) {
multiplicator = static_cast<double>(downsample);
downsampleOfLevel = 1.0;
generateFromPrimarySource = false;
readFromTiff = true;
// Source component of DCM_DerivationDescription
// describes in text where imaging data was acquired from.
sourceDerivationDescription =
std::string("Image frame/tiles extracted without "
"decompression from ") + tiffFile_->path() +
", file level: " + std::to_string(levelToGet) + ", and ";
}
}
// ProgressiveDownsampling
if (!readFromTiff && wsiRequest_->preferProgressiveDownsampling &&
priorLevel != nullptr) {
multiplicator = static_cast<double>(priorLevel->downsample);
downsampleOfLevel = static_cast<double>(downsample) / multiplicator;
// check that downsampling is going from higher to lower magnification
if (downsampleOfLevel >= 1.0) {
// Progressive downsampling, level to get not used. Init to -1.
levelToGet = -1;
sourceLevelWidth = priorLevel->downsampledLevelWidth;
sourceLevelHeight = priorLevel->downsampledLevelHeight;
generateFromPrimarySource = false;
// Source component of DCM_DerivationDescription
// describes in text where imaging data was acquired from.
if (priorLevel->useSourceDerivationDescriptionForDerivedImage) {
sourceDerivationDescription = priorLevel->sourceDerivationDescription;
} else if (downsampleOfLevel > 1.0) {
sourceDerivationDescription =
std::string("Image frame/tiles generated by downsampling, ") +
std::to_string(downsampleOfLevel) + " times; "
"raw pixel values extracted from previous image level and ";
} else {
sourceDerivationDescription =
std::string("Image frame/tiles generated from the raw pixel values "
"and ");
}
}
}
if (generateFromPrimarySource) {
// if no higherMagnifcationDicomFiles then downsample from openslide
levelToGet = getOpenslideLevelForDownsample(downsample);
multiplicator = openslide_get_level_downsample(getOpenSlidePtr(),
levelToGet);
// Downsampling factor required to go from selected
// downsampled level to the desired level of downsampling
if (wsiRequest_->floorCorrectDownsampling) {
multiplicator = floor(multiplicator);
}
downsampleOfLevel = static_cast<double>(downsample) / multiplicator;
openslide_get_level_dimensions(getOpenSlidePtr(),
levelToGet,
&sourceLevelWidth,
&sourceLevelHeight);
// Source component of DCM_DerivationDescription
// describes in text where imaging data was acquired from.
if (downsampleOfLevel > 1.0) {
sourceDerivationDescription =
std::string("Image frame/tiles generated by downsampling, ") +
std::to_string(downsampleOfLevel) + " times, "
"pixel values extracted via OpenSlide(file: " +
wsiRequest_->inputFile + ", level: " +
std::to_string(levelToGet) + ") and ";
} else {
sourceDerivationDescription =
std::string("Image frame/tiles generated from "
"pixel values extracted via OpenSlide(file: ") +
wsiRequest_->inputFile + ", level: " +
std::to_string(levelToGet) + ") and ";
}
readOpenslide = true;
}
// Adjust level size by starting position if skipping row and column.
// downsampledLevelHeight and downsampledLevelWidth will reflect
// new starting position.
int64_t downsampledLevelWidth, downsampledLevelHeight;
int64_t downsampledLevelFrameWidth, downsampledLevelFrameHeight;
DCM_Compression levelCompression;
if (downsample <= 1) {
levelCompression = wsiRequest_->firstlevelCompression;
} else {
levelCompression = wsiRequest_->compression;
}
sourceLevelWidth -= initialX_;
sourceLevelHeight -= initialY_;
dimensionDownsampling(wsiRequest_->frameSizeX, wsiRequest_->frameSizeY,
sourceLevelWidth, sourceLevelHeight,
retile_, downsampleOfLevel,
&downsampledLevelWidth,
&downsampledLevelHeight,
&downsampledLevelFrameWidth,
&downsampledLevelFrameHeight);
slideLevelDim->readFromTiff = readFromTiff;
slideLevelDim->levelToGet = levelToGet;
slideLevelDim->downsample = downsample;
slideLevelDim->multiplicator = multiplicator;
slideLevelDim->downsampleOfLevel = downsampleOfLevel;
slideLevelDim->sourceLevelWidth = sourceLevelWidth;
slideLevelDim->sourceLevelHeight = sourceLevelHeight;
slideLevelDim->downsampledLevelWidth = downsampledLevelWidth;
slideLevelDim->downsampledLevelHeight = downsampledLevelHeight;
slideLevelDim->downsampledLevelFrameWidth = downsampledLevelFrameWidth;
slideLevelDim->downsampledLevelFrameHeight = downsampledLevelFrameHeight;
slideLevelDim->levelCompression = levelCompression;
slideLevelDim->readOpenslide = readOpenslide;
slideLevelDim->sourceDerivationDescription =
std::move(sourceDerivationDescription);
slideLevelDim->useSourceDerivationDescriptionForDerivedImage = false;
return (std::move(slideLevelDim));
}