I am trying to render dicom into bmp using dcm2pnm.exe and dcmdjp2k_e.exe. But the rendering is slow(2 sec 83 millisecond). It is fast for test files that I found online but in the actual image, it is quite slow.
After closer inspection, I found that most of the render time is taken by the dcmdjp2k converting into <dicom file with decompressed JPEG 2000 image>.
I was using an 8.06 MB CR modality image. An application named Stella takes less than 1 second to open this image. So, my goal is also to render within that amount of time. I was wondering whether there is a way to make dcmdjp2k faster Or skip it.
Since I still do not have the full paid package I can not say for sure. But to me, it seems like the conversion to decompressed dicom file by dcmdjp2k for unsupported formats is a mandatory step for DCMTK.
The rendering steps are:
Here is the batch file content that I am using for rendering and measuring the execution time.<dicom file with compressed JPEG 2000 image> → dcmdjp2k → <dicom file with decompressed JPEG 2000 image> → dcm2pnm → <bmp file>
Code: Select all
@echo off
setlocal
rem The format of %TIME% is HH:MM:SS,CS for example 23:59:59,99
set STARTTIME=%TIME%
cd /D "%~dp0"
set dicomFilesDirectory=DicomFiles
set decompressedFilesDirectory=DecompressedFiles
set renderedFilesDirectory=RenderedFiles
set dicomFilePath=%dicomFilesDirectory%\tf-1.dcm
set decompressedFilePath=%decompressedFilesDirectory%\tf-1.dcm
set renderedFilePath=%renderedFilesDirectory%\tf-1.bmp
del %decompressedFilePath%
del %renderedFilePath%
rem here begins the command you want to measure
dir /s > nul
dcmdjp2k_e.exe %dicomFilePath% %decompressedFilePath%
dcm2pnm.exe --write-bmp %decompressedFilePath% %renderedFilePath%
rem here ends the command you want to measure
set ENDTIME=%TIME%
rem output as time
echo STARTTIME: %STARTTIME%
echo ENDTIME: %ENDTIME%
rem convert STARTTIME and ENDTIME to centiseconds
set /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%-100)*6000 + (1%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100)
set /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000 + (1%ENDTIME:~6,2%-100)*100 + (1%ENDTIME:~9,2%-100)
rem calculating the duratyion is easy
set /A DURATION=%ENDTIME%-%STARTTIME%
rem we might have measured the time inbetween days
if %ENDTIME% LSS %STARTTIME% set set /A DURATION=%STARTTIME%-%ENDTIME%
rem now break the centiseconds down to hors, minutes, seconds and the remaining centiseconds
set /A DURATIONH=%DURATION% / 360000
set /A DURATIONM=(%DURATION% - %DURATIONH%*360000) / 6000
set /A DURATIONS=(%DURATION% - %DURATIONH%*360000 - %DURATIONM%*6000) / 100
set /A DURATIONHS=(%DURATION% - %DURATIONH%*360000 - %DURATIONM%*6000 - %DURATIONS%*100)
rem some formatting
if %DURATIONH% LSS 10 set DURATIONH=0%DURATIONH%
if %DURATIONM% LSS 10 set DURATIONM=0%DURATIONM%
if %DURATIONS% LSS 10 set DURATIONS=0%DURATIONS%
if %DURATIONHS% LSS 10 set DURATIONHS=0%DURATIONHS%
rem outputing
echo STARTTIME: %STARTTIME% centiseconds
echo ENDTIME: %ENDTIME% centiseconds
echo DURATION: %DURATION% in centiseconds
echo %DURATIONH%:%DURATIONM%:%DURATIONS%,%DURATIONHS%
pause
endlocal
goto :EOF
Screenshot of the rendering time: