Mercurial > hg > orthanc
comparison OrthancFramework/Sources/DicomParsing/ParsedDicomFile.cpp @ 4947:dfbe764995cf
added ParsedDicomFile::DecodeAllOverlays()
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 21 Mar 2022 08:59:20 +0100 |
parents | 6a59dc426f93 |
children | 1610e56cadfb |
comparison
equal
deleted
inserted
replaced
4946:51e4947aa3b3 | 4947:dfbe764995cf |
---|---|
1918 rescaleSlope = 1; | 1918 rescaleSlope = 1; |
1919 } | 1919 } |
1920 } | 1920 } |
1921 | 1921 |
1922 | 1922 |
1923 void ParsedDicomFile::ListOverlays(std::set<unsigned int>& groups) const | 1923 void ParsedDicomFile::ListOverlays(std::set<uint16_t>& groups) const |
1924 { | 1924 { |
1925 DcmDataset& dataset = *const_cast<ParsedDicomFile&>(*this).GetDcmtkObject().getDataset(); | 1925 DcmDataset& dataset = *const_cast<ParsedDicomFile&>(*this).GetDcmtkObject().getDataset(); |
1926 | 1926 |
1927 // "Repeating Groups shall only be allowed in the even Groups (6000-601E,eeee)" | 1927 // "Repeating Groups shall only be allowed in the even Groups (6000-601E,eeee)" |
1928 // https://dicom.nema.org/medical/dicom/2021e/output/chtml/part05/sect_7.6.html | 1928 // https://dicom.nema.org/medical/dicom/2021e/output/chtml/part05/sect_7.6.html |
1951 } | 1951 } |
1952 | 1952 |
1953 | 1953 |
1954 ImageAccessor* ParsedDicomFile::DecodeOverlay(int& originX, | 1954 ImageAccessor* ParsedDicomFile::DecodeOverlay(int& originX, |
1955 int& originY, | 1955 int& originY, |
1956 unsigned int group) const | 1956 uint16_t group) const |
1957 { | 1957 { |
1958 // https://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.9.2.html | 1958 // https://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.9.2.html |
1959 | 1959 |
1960 DcmDataset& dataset = *const_cast<ParsedDicomFile&>(*this).GetDcmtkObject().getDataset(); | 1960 DcmDataset& dataset = *const_cast<ParsedDicomFile&>(*this).GetDcmtkObject().getDataset(); |
1961 | 1961 |
2012 throw OrthancException(ErrorCode_CorruptedFile, "Invalid overlay"); | 2012 throw OrthancException(ErrorCode_CorruptedFile, "Invalid overlay"); |
2013 } | 2013 } |
2014 } | 2014 } |
2015 | 2015 |
2016 | 2016 |
2017 ImageAccessor* ParsedDicomFile::DecodeAllOverlays(int& originX, | |
2018 int& originY) const | |
2019 { | |
2020 std::set<uint16_t> groups; | |
2021 ListOverlays(groups); | |
2022 | |
2023 if (groups.empty()) | |
2024 { | |
2025 originX = 0; | |
2026 originY = 0; | |
2027 return new Image(PixelFormat_Grayscale8, 0, 0, false); | |
2028 } | |
2029 else | |
2030 { | |
2031 std::set<uint16_t>::const_iterator it = groups.begin(); | |
2032 assert(it != groups.end()); | |
2033 | |
2034 std::unique_ptr<ImageAccessor> result(DecodeOverlay(originX, originY, *it)); | |
2035 assert(result.get() != NULL); | |
2036 ++it; | |
2037 | |
2038 int right = originX + static_cast<int>(result->GetWidth()); | |
2039 int bottom = originY + static_cast<int>(result->GetHeight()); | |
2040 | |
2041 while (it != groups.end()) | |
2042 { | |
2043 int ox, oy; | |
2044 std::unique_ptr<ImageAccessor> overlay(DecodeOverlay(ox, oy, *it)); | |
2045 assert(overlay.get() != NULL); | |
2046 | |
2047 int mergedX = std::min(originX, ox); | |
2048 int mergedY = std::min(originY, oy); | |
2049 right = std::max(right, ox + static_cast<int>(overlay->GetWidth())); | |
2050 bottom = std::max(bottom, oy + static_cast<int>(overlay->GetHeight())); | |
2051 | |
2052 assert(right >= mergedX && bottom >= mergedY); | |
2053 unsigned int width = static_cast<unsigned int>(right - mergedX); | |
2054 unsigned int height = static_cast<unsigned int>(bottom - mergedY); | |
2055 | |
2056 std::unique_ptr<ImageAccessor> merged(new Image(PixelFormat_Grayscale8, width, height, false)); | |
2057 ImageProcessing::Set(*merged, 0); | |
2058 | |
2059 ImageAccessor a; | |
2060 merged->GetRegion(a, originX - mergedX, originY - mergedY, result->GetWidth(), result->GetHeight()); | |
2061 ImageProcessing::Maximum(a, *result); | |
2062 | |
2063 merged->GetRegion(a, ox - mergedX, oy - mergedY, overlay->GetWidth(), overlay->GetHeight()); | |
2064 ImageProcessing::Maximum(a, *overlay); | |
2065 | |
2066 originX = mergedX; | |
2067 originY = mergedY; | |
2068 result.reset(merged.release()); | |
2069 | |
2070 ++it; | |
2071 } | |
2072 | |
2073 return result.release(); | |
2074 } | |
2075 } | |
2076 | |
2077 | |
2017 #if ORTHANC_BUILDING_FRAMEWORK_LIBRARY == 1 | 2078 #if ORTHANC_BUILDING_FRAMEWORK_LIBRARY == 1 |
2018 // Alias for binary compatibility with Orthanc Framework 1.7.2 => don't use it anymore | 2079 // Alias for binary compatibility with Orthanc Framework 1.7.2 => don't use it anymore |
2019 void ParsedDicomFile::DatasetToJson(Json::Value& target, | 2080 void ParsedDicomFile::DatasetToJson(Json::Value& target, |
2020 DicomToJsonFormat format, | 2081 DicomToJsonFormat format, |
2021 DicomToJsonFlags flags, | 2082 DicomToJsonFlags flags, |