imagemagick使用

PerlMagick是一个Perl模块,允许用户使用各种ImageMagick命令创建脚本。 大多数用户可能会执行此操作以进行批处理,甚至可能进行一些串行批处理。 在本文中,我将展示我作为神经病学家时出于个人目的所做的一个项目。

如今,神经病学的许多实践都涉及审查大脑的各种图像。 医院和医师办公室设置为直接连接到成像软件,该软件允许从业人员在线查看这些图像。 一项MRI研究可能会在检查和重新检查头部时包括数百张图像,更改各种参数以突出显示大脑中不同的化学成分,或者显示与没有运动的区域相比有运动的地方,例如血管中的血液。

这些图像可以保存到CD,我(或患者)可以将其带到我的办公室以便以后查看。 我无法访问可能已进行扫描的所有地方,因此这是必不可少的。

医学图像以DICOM格式保存,DICOM格式是所有X射线和扫描设备(例如CT或MRI扫描仪)制造商使用的专有格式。 每个磁盘还包含读取这些映像的软件,如您所料,它仅与Windows兼容。 如果单击文件,Linux本身将不知道如何打开它,但是 ImageMagick会这样做,因此,当弹出对话框询问打开文件的方式时,您可能只是输入display并查看图像。 我很快发现我需要在命令中添加-normalize ,因为这些灰度图像的比例非常大,即使所有像素可能都位于比例的低端。 以下示例显示了在应用-normalize之前和之后的相同图像。

在应用“规范化”命令之前和之后的同一张图片

您可以将cd到包含一系列图像的目录中,在命令行中键入display -normalize * ,然后一个一个地查看这些图像,但这不是我们查看扫描的方式。 您需要能够一次看到多个图像,因为它们实际上是在对头部和大脑的切片进行相距几毫米的成像。 这将使您更好地了解某些异常会影响哪些大脑结构,并且您将能够更好地确定异常是什么—正常的大脑是否已改变,或者某些非脑组织如肿瘤? 为何一次查看多张图像是为什么在数字化图像查看之前,将扫描图像打印在大胶片上以便用灯箱查看。

我要操纵图像的原因之一是在我演讲时要说明一些异常的成像,以讨论诊断或治疗难题。 当您要显示来自多个不同患者的示例或从不同时间点进行扫描时,使用CD甚至是在线软件都非常耗时。

在先前的文章中 ,我展示了如何在命令行上轻松地操作图像和蒙太奇。 但是在这里,我们谈论的是成百上千张映像分散在CD上的多个目录之间。 无论如何,该项目的开始涉及手动操作和评估目录结构。

在此示例中,实际图像数据全部位于CD上名为dicom的目录下。 在该目录下是一个带有数字5771的目录,在5771以下是一系列子目录:5772、5773和最多57717。在这些子目录中的每个目录中都有实际的图像文件,并且每个目录对应于特定的设置序列制作图像时使用的扫描仪。 在过去的案例中,我曾看到带有.dcm后缀的图像文件,但是在此CD上它们只是数字。 至少所有图像都处于目录结构的同一级别。

上Perl

Perl需要做的第一件事是找到所有目录。 我决定将这张特定的CD硬编码到脚本中:

$initdir = 
     
     "/run/media/gregp/DCS/dicom/5771" ;
     
     


opendir 
     
     ( DIR, 
     
     $initdir 
     
     ) 
     
     || die 
     
     "Do you have cdrom mounted?" ;
     
     

@ dicomdir = 
     
     grep 
     
     { 
     
     !/ ^\. 
     
     / 
     
     } readdir 
     
     ( DIR 
     
     ) ;
     
     

@ dicomdir = 
     
     grep 
     
     { 
     
     !/ 
     
     [ a-zA-Z 
     
     ] 
     
     / 
     
     } 
     
     @ dicomdir;
     
     


closedir 
     
     ( DIR 
     
     ) ;

我们打开此顶级目录,然后将子目录加载到数组@dicomdir ,筛选出dot文件和任何带有字母的内容。 接下来,我们根据每个目录中的文件名构建一个数组:

foreach 
     
     $dicomdir 
     
     ( 
     
     @ dicomdir 
     
     ) 
     
     { 
     
     


    opendir 
     
     ( DIR, 
     
     " $initdir / $dicomdir " 
     
     ) 
     
     || die 
     
     "no can do" ;
     
     


    
     
     @ files = 
     
     grep 
     
     { 
     
     !/ ^\. 
     
     / 
     
     } readdir 
     
     ( DIR 
     
     ) ;
     
     


    
     
     $number = scalar 
     
     ( 
     
     @ files 
     
     ) ;
     
     


    
     
     if 
     
     ( 
     
     $number 
     
     > 
     
     80 
     
     ) 
     
     { 
     
     


        print 
     
     " \n Sorry, there were too many files in $dicomdir to process \n " ;
     
     


    
     
     }

在我先前关于蒙太奇的文章中,我解释了如果蒙太奇画面太大,您的计算机可能会窒息,因此在这里,我设置了80个图像的截断值–如果目录中的图像数量过多,则将跳过该图像。

一旦越过障碍,我们就可以从事ImageMagick的业务:

else 
     
     { 
     
     

mkdir 
     
     " $workdir / $dicomdir " ;
     
     


foreach 
     
     $file 
     
     ( 
     
     @ files 
     
     ) 
     
     { 
     
     

@ args = 
     
     ( 
     
     "cp" , 
     
     " $initdir / $dicomdir / $file " , 
     
     " $workdir / $dicomdir / $file " 
     
     ) ;
     
     


system 
     
     @ args;
     
     

} 
     
     


chdir 
     
     " $workdir / $dicomdir " ;
     
     

$images =Image::Magick- 
     
     > new 
     
     ( 
     
     ) ;
     
     

$x = 
     
     $images - 
     
     > ReadImage 
     
     ( 
     
     " $workdir / $dicomdir /*" 
     
     ) ;
     
     

$images - 
     
     > Normalize 
     
     ( 
     
     ) ;
     
     

$montage = 
     
     $images - 
     
     > Montage 
     
     ( 
     
     geometry = 
     
     > 
     
     '300x300' , 
     
     tile = 
     
     > 
     
     '4x' , 
     
     label = 
     
     > 
     
     '%f' , 
     
     title = 
     
     > 
     
     $dicomdir 
     
     ) ;
     
     

$montage - 
     
     > Write 
     
     ( 
     
     "\.\./ $dicomdir \.jpg" 
     
     ) ;
     
     


   
     
     }

我决定先将所有文件复制到硬盘上,然后从那里进行图像处理; 因此,每个文件都将复制到以与CD上相同名称创建的目录中。 请记住,我们正在一张一张地遍历包含图像的目录。 复制之后,我将工作目录更改为该硬盘驱动器位置,在这里我们可以开始查看PerlMagick的面向对象的术语。 当我第一次写这篇文章时,我试图从DICOM图像创建JPG蒙太奇,以为我可以在查看蒙太奇时进行归一化,但是事实证明,这种方法效果不佳。 因此,我要做的第一件事是在每个图像上运行Normalize()操作,然后继续执行montage命令,该命令类似于您在命令行上使用的元素。 还值得指出的是,当我将蒙太奇内容写入硬盘驱动器时,我将其放在图像目录的上方

最后一步是清除工作阵列并关闭此CD目录,因为我们将移至@dicomdir的下一个@dicomdir 。

$images = 
     
     ( 
     
     ) ;
     
     


closedir 
     
     ( DIR 
     
     ) ;
     
     

@ files = 
     
     ( 
     
     ) 
     
     

}

现在是结果。 在所有这些蒙太奇处于相同水平的情况下,我可以简单地在命令行中输入:

display *.jpg

这是一个蒙太奇的有趣部分:

ImageMagick界面启动 imagemagick使用_ImageMagick界面启动

扩散加权图像。较亮的区域表示正常的液体运动比大脑其他部位慢。

这显示了该系列中30张图像中的8张。 这些被称为扩散加权图像,这意味着大脑较亮的区域显示出正常的液体进出细胞的速度比大脑其他部位慢。 扫描是在右小脑半球发生卒中的患者(在图像的左侧看到;这就是扫描图像的产生方式)上进行的。 我的评估是这些图像与CD上的图像质量相同。

这些蒙太奇的另一个优点是消除了对隐私的担忧。 每个DICOM图像文件都包含设施和患者信息,但是通过将每个图像处理为JPG都没有此数据,因此我可以自由共享和保存图像。 确保一切正常后,可以删除硬盘驱动器上的原始映像副本。

这是完整的脚本:

#!/usr/bin/perl -w 
     
     


use Image::Magick;
     
     


my 
     
     ( 
     
     $images , 
     
     $x 
     
     ) ;
     
     


print 
     
     "Enter the name of the folder for the first case: \t " ;
     
     


chomp 
     
     ( 
     
     $folder = 
     
     < STDIN 
     
     > 
     
     ) ;
     
     

$workdir = 
     
     "/home/gregp/dicom/ $folder " ;
     
     

mkdir 
     
     $workdir 
     
     || die 
     
     "Could not make $folder : $!" ;
     
     

$initdir = 
     
     "/run/media/gregp/DCS/dicom/5771" ;
     
     


opendir 
     
     ( DIR, 
     
     $initdir 
     
     ) 
     
     || die 
     
     "Do you have cdrom mounted?" ;
     
     

@ dicomdir = 
     
     grep 
     
     { 
     
     !/ ^\. 
     
     / 
     
     } readdir 
     
     ( DIR 
     
     ) ;
     
     

@ dicomdir = 
     
     grep 
     
     { 
     
     !/ 
     
     [ a-zA-Z 
     
     ] 
     
     / 
     
     } 
     
     @ dicomdir;
     
     


closedir 
     
     ( DIR 
     
     ) ;
     
     


foreach 
     
     $dicomdir 
     
     ( 
     
     @ dicomdir 
     
     ) 
     
     { 
     
     


print 
     
     " $dicomdir \t " ;
     
     

} 
     
     


foreach 
     
     $dicomdir 
     
     ( 
     
     @ dicomdir 
     
     ) 
     
     { 
     
     


opendir 
     
     ( DIR, 
     
     " $initdir / $dicomdir " 
     
     ) 
     
     || die 
     
     "no can do" ;
     
     

@ files = 
     
     grep 
     
     { 
     
     !/ ^\. 
     
     / 
     
     } readdir 
     
     ( DIR 
     
     ) ;
     
     

$number = scalar 
     
     ( 
     
     @ files 
     
     ) ;
     
     

if 
     
     ( 
     
     $number 
     
     > 
     
     80 
     
     ) 
     
     { 
     
     


print 
     
     " \n Sorry, there were too many files in $dicomdir to process \n " ;
     
     

} 
     
     

else 
     
     { 
     
     

mkdir 
     
     " $workdir / $dicomdir " ;
     
     


foreach 
     
     $file 
     
     ( 
     
     @ files 
     
     ) 
     
     { 
     
     

@ args = 
     
     ( 
     
     "cp" , 
     
     " $initdir / $dicomdir / $file " , 
     
     " $workdir / $dicomdir / $file " 
     
     ) ;
     
     


system 
     
     @ args;
     
     

} 
     
     


chdir 
     
     " $workdir / $dicomdir " ;
     
     

$images =Image::Magick- 
     
     > new 
     
     ( 
     
     ) ;
     
     

$x = 
     
     $images - 
     
     > ReadImage 
     
     ( 
     
     " $workdir / $dicomdir /*" 
     
     ) ;
     
     

$images - 
     
     > Normalize 
     
     ( 
     
     ) ;
     
     

$montage = 
     
     $images - 
     
     > Montage 
     
     ( 
     
     geometry = 
     
     > 
     
     '300x300' , 
     
     tile = 
     
     > 
     
     '4x' , 
     
     label = 
     
     > 
     
     '%f' , 
     
     title = 
     
     > 
     
     $dicomdir 
     
     ) ;
     
     

$montage - 
     
     > Write 
     
     ( 
     
     "\.\./ $dicomdir \.jpg" 
     
     ) ;
     
     

} 
     
     

$images = 
     
     ( 
     
     ) ;
     
     


closedir 
     
     ( DIR 
     
     ) ;
     
     

@ files = 
     
     ( 
     
     ) 
     
     

}

我以前没有显示的一个元素是,最初它要求为蒙太奇文件所在的目录命名。 另一则消息显示了要检查的目录。

翻译自: https://opensource.com/article/17/12/image-manipulation-image-magick-perl

imagemagick使用