📄 dimoopxt.h
字号:
value2 = lastvalue; else value2 = OFstatic_cast(Uint32, OFstatic_cast(double, vlut->getValue(value)) * gradient1); *(q++) = OFstatic_cast(T3, dlut->getValue(plut->getValue(value2))); } } } else { // don't use display: invalid or absent const double gradient2 = outrange / OFstatic_cast(double, plut->getAbsMaxRange()); for (i = 0; i < ocnt; ++i) { value = OFstatic_cast(T2, i) + absmin; if (value <= firstentry) value2 = firstvalue; else if (value >= lastentry) value2 = lastvalue; else value2 = OFstatic_cast(Uint32, OFstatic_cast(double, vlut->getValue(value)) * gradient1); *(q++) = OFstatic_cast(T3, OFstatic_cast(double, low) + OFstatic_cast(double, plut->getValue(value2)) * gradient2); } } const T3 *lut0 = lut - OFstatic_cast(T2, inter->getAbsMinimum()); // points to 'zero' entry q = Data; for (i = Count; i != 0; --i) // apply LUT *(q++) = *(lut0 + (*(p++))); } if (lut == NULL) // use "normal" transformation { if (dlut != NULL) // perform display transformation { if (low > high) // inverse { const Uint16 maxvalue = OFstatic_cast(Uint16, vlut->getAbsMaxRange() - 1); for (i = Count; i != 0; --i) { value = OFstatic_cast(T2, *(p++)); // pixel value if (value <= firstentry) value2 = firstvalue; else if (value >= lastentry) value2 = lastvalue; else value2 = OFstatic_cast(Uint32, OFstatic_cast(double, vlut->getValue(value)) * gradient1); *(q++) = OFstatic_cast(T3, dlut->getValue(OFstatic_cast(Uint16, maxvalue - plut->getValue(value2)))); } } else { // normal for (i = Count; i != 0; --i) { value = OFstatic_cast(T2, *(p++)); // pixel value if (value <= firstentry) value2 = firstvalue; else if (value >= lastentry) value2 = lastvalue; else value2 = OFstatic_cast(Uint32, OFstatic_cast(double, vlut->getValue(value)) * gradient1); *(q++) = OFstatic_cast(T3, dlut->getValue(plut->getValue(value2))); } } } else { // don't use display: invalid or absent const double gradient2 = outrange / OFstatic_cast(double, plut->getAbsMaxRange()); for (i = Count; i != 0; --i) { value = OFstatic_cast(T2, *(p++)); // pixel value if (value <= firstentry) value2 = firstvalue; else if (value >= lastentry) value2 = lastvalue; else value2 = OFstatic_cast(Uint32, OFstatic_cast(double, vlut->getValue(value)) * gradient1); *(q++) = OFstatic_cast(T3, OFstatic_cast(double, low) + OFstatic_cast(double, plut->getValue(value2)) * gradient2); } } } } else { // has no presentation LUT createDisplayLUT(dlut, disp, vlut->getBits()); const double gradient = outrange / OFstatic_cast(double, vlut->getAbsMaxRange()); const T3 firstvalue = OFstatic_cast(T3, OFstatic_cast(double, low) + OFstatic_cast(double, vlut->getFirstValue()) * gradient); const T3 lastvalue = OFstatic_cast(T3, OFstatic_cast(double, low) + OFstatic_cast(double, vlut->getLastValue()) * gradient); if (initOptimizationLUT(lut, ocnt)) { // use LUT for optimization q = lut; if (dlut != NULL) // perform display transformation { if (low > high) // inverse { const Uint16 maxvalue = OFstatic_cast(Uint16, vlut->getAbsMaxRange() - 1); for (i = 0; i < ocnt; ++i) { value = OFstatic_cast(T2, i) + absmin; if (value < firstentry) value = firstentry; else if (value > lastentry) value = lastentry; *(q++) = OFstatic_cast(T3, dlut->getValue(OFstatic_cast(Uint16, maxvalue - vlut->getValue(value)))); } } else { // normal for (i = 0; i < ocnt; ++i) { value = OFstatic_cast(T2, i) + absmin; if (value < firstentry) value = firstentry; else if (value > lastentry) value = lastentry; *(q++) = OFstatic_cast(T3, dlut->getValue(vlut->getValue(value))); } } } else { // don't use display: invalid or absent for (i = 0; i < ocnt; ++i) // calculating LUT entries { value = OFstatic_cast(T2, i) + absmin; if (value <= firstentry) *(q++) = firstvalue; else if (value >= lastentry) *(q++) = lastvalue; else *(q++) = OFstatic_cast(T3, OFstatic_cast(double, low) + OFstatic_cast(double, vlut->getValue(value)) * gradient); } } const T3 *lut0 = lut - OFstatic_cast(T2, inter->getAbsMinimum()); // points to 'zero' entry q = Data; for (i = Count; i != 0; --i) // apply LUT *(q++) = *(lut0 + (*(p++))); } if (lut == NULL) // use "normal" transformation { if (dlut != NULL) // perform display transformation { if (low > high) // inverse { const Uint16 maxvalue = OFstatic_cast(Uint16, vlut->getAbsMaxRange() - 1); for (i = Count; i != 0; --i) { value = OFstatic_cast(T2, *(p++)); if (value < firstentry) value = firstentry; else if (value > lastentry) value = lastentry; *(q++) = OFstatic_cast(T3, dlut->getValue(OFstatic_cast(Uint16, maxvalue - vlut->getValue(value)))); } } else { // normal for (i = Count; i != 0; --i) { value = OFstatic_cast(T2, *(p++)); if (value < firstentry) value = firstentry; else if (value > lastentry) value = lastentry; *(q++) = OFstatic_cast(T3, dlut->getValue(vlut->getValue(value))); } } } else { // don't use display: invalid or absent for (i = 0; i < Count; ++i) { value = OFstatic_cast(T2, *(p++)); if (value <= firstentry) *(q++) = firstvalue; else if (value >= lastentry) *(q++) = lastvalue; else *(q++) = OFstatic_cast(T3, OFstatic_cast(double, low) + OFstatic_cast(double, vlut->getValue(value)) * gradient); } } } } delete[] lut; } if (Count < FrameSize) OFBitmanipTemplate<T3>::zeroMem(Data + Count, FrameSize - Count); // set remaining pixels of frame to zero } } else Data = NULL; } /** perform linear scaling to the output data (no windowing) * ** @param inter pointer to intermediate pixel representation * @param start offset of the first pixel to be processed * @param plut presentation LUT (optional, maybe NULL) * @param disp display function (optional, maybe NULL) * @param low lowest pixel value for the output data (e.g. 0) * @param high highest pixel value for the output data (e.g. 255) */ void nowindow(const DiMonoPixel *inter, const Uint32 start, const DiLookupTable *plut, DiDisplayFunction *disp, const T3 low, const T3 high) { const DiDisplayLUT *dlut = NULL; const T1 *pixel = OFstatic_cast(const T1 *, inter->getData()); if (pixel != NULL) { if (Data == NULL) // create new output buffer Data = new T3[FrameSize]; if (Data != NULL) {#ifdef DEBUG if (DicomImageClass::checkDebugLevel(DicomImageClass::DL_Informationals)) { ofConsole.lockCerr() << "INFO: using VOI routine 'nowindow()'" << endl; ofConsole.unlockCerr(); }#endif const double absmin = inter->getAbsMinimum(); const double absmax = inter->getAbsMaximum(); const double outrange = OFstatic_cast(double, high) - OFstatic_cast(double, low) + 1; const unsigned long ocnt = OFstatic_cast(unsigned long, inter->getAbsMaxRange()); // number of LUT entries register const T1 *p = pixel + start; register T3 *q = Data; register unsigned long i; T3 *lut = NULL; if ((plut != NULL) && (plut->isValid())) // has presentation LUT {#ifdef DEBUG if (DicomImageClass::checkDebugLevel(DicomImageClass::DL_Informationals)) { ofConsole.lockCerr() << "INFO: using presentation LUT transformation" << endl; ofConsole.unlockCerr(); }#endif createDisplayLUT(dlut, disp, plut->getBits()); register Uint32 value; // presentation LUT is always unsigned const double gradient1 = OFstatic_cast(double, plut->getCount()) / inter->getAbsMaxRange(); const double gradient2 = outrange / OFstatic_cast(double, plut->getAbsMaxRange()); if (initOptimizationLUT(lut, ocnt)) { // use LUT for optimization q = lut; if (dlut != NULL) // perform display transformation { if (low > high) // inverse
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -