この記事では、DCMの医療画像ファイルを解析し、ファイル情報を抽出するJava方法について説明します。次のように、参照のために共有してください。
1。インストール
まず、GitHubに移動してソースコードをダウンロードし、ローカルインストールのためにMVNインストールを実行します。 Maven Centralリポジトリには瓶がありません。 。インストールが成功した後、以下は次のとおりです。
次に、pom.xmlファイルにJARパッケージを紹介します。
<Dependency> groupId> org.dcm4che </groupid> <artifactid> dcm4che-core </artifactid> <バージョン> 3.3.2 </version> </dependency>
2。テストカテゴリ
/** * projectName:xxx * filename:displaytag.java * packagename:com.xxxx.xxxx.common.util *日付:2018-03-26 10:07 *著作権(c)2017-2020 xxx Company */Package com.gz.common.util.wava.wt.image; java.io.file; import java.io.ioexception; Import java.sql.time; Import java.util.arrays; Import java.util.date; Import java.util.logging.level; Import java.util.logging.logger; Import org.dcm4che3.data.attriute; dcm4che3.data.elementdictionary; Import org.dcm4che3.data.fragments; Import org.dcm4che3.data.sequence; import org.dcm4che3.data.tag; Import org.dcm4che3.data.vr; Import org.dcm4che.vr; Import org.dcm4che.io org.dcm4che3.io.dicominputStream; Import org.dcm4che3.io.dicomoutputStream; Import org.dcm4che3.util.safeclose; Import java.awt.image.raster; Import Java.io.ioexception; Import Java.util.util.util. * @classname:displaytag * @packagename:com.xxxx.xxxx.common.util * @description:タグparsing * @data:2018-03-26 10:07 **/public final class displaytag {private static属性obj = null、object = null; Private static diCominputStream DIN; Private static double resultFactordix;プライベート文字列結果= null;プライベートダブル結果2 = null;プライベートストリングnom = null; private string nounstring = null; Private int val2 = 0; Private Int Valeurturn; private string noununit = null; private static double resultfacteurdix = 0;プライベートダブルValuesPatial = null; private string noununitratio = null; private dicominputStream dis; private static final char [] hex_digits = {'0'、 '1'、 '2'、 '3'、 '4'、 '5'、 '6'、 '7'、 '8'、 '' a '、' b '、' c '、' d '、' e '、' f '}; private dicomencodingoptions encopts = dicomencodingoptions.default; private static element -dictionary dict = elementDictionary.getStandardElementDictionary(); public displaytag(file file){try {setObject(loaddicomobject(file)); } catch(ioException ex){logger.getLogger(displaytag.class.getName())。log(level.severe、null、ex); }} / ** * DICOM 3.0のメタデータを読む * @param F:入力ファイル * @return属性 * @throws ioexception * / public static属性loaddicomobject(file f)throws ioexception {(f == null){return null; } else {dicominputStream dis = new dicominputStream(f); //attr.setspecificcharacterset("gbk "); dis.readdataset(-1、-1)を返します。 }} / ** * put astibut * @param obj * / public void setObject(astributes obj){this.obj = obj; } / ** * metadataの属性を与える * @return * / public static属性getobject(){return obj; } / ** * display metadata * @param file:file inout * @throws ioexception * / public string readtagdicom(file file)throws ioexception {din = new dicominputStream(file); object = din.readfilemetainformation(); string value = object.toString(); object = din.readdataset(-1、-1);返品値。 } / ** * permet d'afficher l'heure d'une valeur dicom en Standard International yyy.mm.dd /許可表示yyy.mm.dd * @param du tag / intタグyyyy.mm.dd else dd.mm.yyyy * @param valuenoun: "dot" mettre la date en en en format yyyyy.mm.dd ou dd.mm.yyyy sinon en format yyyy mm dd ou dd ou dd mm yyyy/ "dot else yyyy mmまたはdd mm yyyyy * @return afficher le string du tag selon le stardent international/ return string date * @throws ioexception */ public string dicomdate(int、boolean valuebool、string valueNoun)スローIOException string tagdayfomat = formatdate(tagvalue、valuebool、valuenoun); tagdayfomatを返します。 } else {return null; }}}/ ** * permet d'afficher l'heure d'une valeur dicom en Standard International yyy.mm.dd/許可yyyy.mm.dd * @param Objectのメタデータの時間を表示します。 dd.mm.yyyyy/ if true format yyyy.mm.dd else dd.mm.yyyy * @param valuenoun: "dot" mettre la date en en en en en en en een format yyyy.mm.dd ou dd.mm.yyyy sinon en format yyyy mm dd ou dd mm yyy/ dd dd.mm.ddまたはdd.mm.yyy else yyyy mm or dd mm yyyy * @return le string du tag selon le stander/ return date * @throws ioexception */ public static string dicomdate(属性オブジェクト、intタグ、ブレアン価値= strows strows ioexpring( tagdayfomat = formatdate(tagvalue、valuebool、valuenoun); dd.mm.yyyy else in yyyy mm ddまたはdd mm yyyyy *@return */public static string formatdate(string numero、boolean valuebool、string valuenoun){if(numero.matches( "^[0-9] *$")){// stringbuffer(); if(valuebool == true){// format yyy.mm.dd for(int i = numero.length(); i <j; i ++){r.append(i)); ValueNoun.equals( '。'); == null:valuenoun.equals( "dot")){r.append( '。'); if(valuenoun == null? "dot" == null:valuenoun.equals( "dot"){r.append( '。');インデックスゼロ、インデックス1、およびArray Indexingの場合。 getheaderdatevalue(string tagnr){return getheaderdatevalue(totagint(tagnr));ヘッダー番号の表現 * eg 0008,0010への対応する整数への対応する整数として0x00080010 * @see org.dcm4che2.data.tag * @param headernr eg 0008,0010 * @return 0x00080010 as as int */ public static headernr) integer.parseint(headernr.replaceall( "、"、 "")、16); of vr = da * @param tagnr: "0000,0010" * @param dicomobj */ public date getheaderdatevalue(string tagnr、属性dicomobj) TextDicom(string num){num.ReplaceAll( "//^+"、 ""); string tagvalue = arrays.aslist(tagvalue2).toString(); string tagvalue = displaytag.arraytostring(tagvalue2、 "//"); (length> 0){a [0]); sの取得時間での時間 *(0008,0032)s画像時間 * @param tag:@return * @throws ioexception */ public string dicomtime(int tag)throws {if(getobject() formatnotdot(tagvalue); (0008,0033)@param tag:wide wath ofturn */ public string dicomtimetotal(int tag)throws {getobject()。 } else {return null;} /** * s sight time at s sigre at at s sight timeでのhh.mm.ss *(0008,0031)の表示時間 *(0008,0032) *(0008,0032) *(0008,0032) *(0008,0033) ioException *dicomtime2(int tag)は、string tagvalue.getString = formatnotdot(tagvalue)をスローします。 / ** * sシリーズ時のsシリーズ時のhh.mm.ss.frac *(0008,0031)でのhh.mm.ss.frac *(0008,0030)の表示時間を許可 * diComtime3(属性、intタグ)はioexception {string tagstring(tag); getobject()。getint(tagnr、0); ** * * @param tagnr eg "0018,0050" <br> *または "0008,0102#0054,0220" getheaderintegervalue(totagint(tagnr)); cantainsheadertag(int tagnr){return getobject()。患者名 */ public string getheadername(string tagnr){return getheadname(totagint(tagnr)); getobject(tagnr) .Append( "[").Append(getVr(tag))。appled( "]")。 || getobject()。{return true} / ** Static Int totagint2(String headernr){return integer.parseint( "、"、 "")、16); (num.matches( "^0 * $"){num = ""; 6; numero.charat(i)&&(i <(j -1))) numero){numero.matches( "^[0-9]。*$")){stringbuilder() rutch r.toString(); SetFactorPower(10,2)// 10^2 * @param factor * @return */public static double setfactorpower(double result3、double factor) * @param dcmobj * @return */ public static int [] lattricepixeldata(属性dcmobj){] data = dcmobj.getints(tag.pixeldata)}/ ** * @return * ioException {int [] data = getobject(tag.pixeldata); dcmobj.getbytes(tag.pixeldata) Pixeldata * @Param Raster * @return */privatedata(rasterラスター){raster.getWidth() int [] [] new int [h] [w]; data2){data2.int 2 [0] array [h*w];値テーブル入力 * @param患者_additional_tags: * public static final int [] {0x00080020、0x00080022、} Dis.ReadDicomobject(); :Patient_additional_tags){i] = object.getString(tag); readitem(file inputfile){displaytag dcm = new displaytag(dcm.getobject() ATTR.TOSTRING(); Sequence seq = dc.getobject()。 RegionDatatype * - PhysicalUnitsXDirection * - PhysicalUnitsXDirection * -PixelComponentPhysicalUnits * * * * * * @Param result */public void unit(int tag、string result){if(tag == regionspatialformat){val2 = val2 = integer.valueof setnoununit(「グラフィックス」)またはflow "); break; case 0:setnoununit("なしか、該当なし "); break; default:break;}} else if(tag == tag.regiondatatype){val2 = integer.valueof(result).intvalue(); // convertie en int switch(val2){case 12:setnoununit(amplitus(amplitus) 11:setnoununit(dt); setnounit(doppler gean setnunit)。 This.setnounit(該当なし); trace "); break; case" d ":this.setnoununit(" gray bar "); break; case" e ":this.setnoununit(" color bar "); break; case" f ":this.setnounit(" Integrated Backatter "); == pixelcomponedphysicalunits){val2 = integer.intvalue(); setnounit(cm*setnounit); setnounit(db/pixel ")。 this.setnounit(cm*cm*pixel/sec "); setNounUnit("Computed Border"); break; case 8: setNounUnit("Integrated Backscatter"); br eak; case 7: setNounUnit("Color bar"); break; case 6: this.setNounUnit("Gray bar"); break; case 5: this.setNounUnit("Color Flow Intensity"); break; case 4: setNounUnit("Color Flow Variance"); break; case 3: setnounit(case breaking); classification ");} elles {this.setnoununit(" none or not not ");} / ** * enregistrel'intédesアイテム /アイテムの統一 * @param noununit * @return this.noununit = noununit * / public string setnounit; l'intédesitems。 -PixelComponentPhysicalUnits * * @param result: prend l'unite */ public void unitRatioSpatial(int TAG, String result){ if (TAG == Tag.PhysicalUnitsXDirection || TAG == Tag.PhysicalUnitsYDirection || TAG == Tag.PixelComponentPhysicalUnits){ val2= integer.valueof(result).intvalue(); // convertie en int switch(val2){case 9:double valuespatial1 = getValeurtagitemdoubleratio()* setAgitemdoubleratio(10,1); setnoununitratio(mm mm.pixel/sec」) 7:setnoununitratio 6: setnoununitratio(mm/pixel);適用可能 "); break; default:break;} switch(result){case" a ":double valuespatial3 = getValeurtagitemdoubleratio()*setFacteurpuissance(10,2); setagitemdoubleratio(valuespatial3); 「B」:getValeurtagitemdoubleratio()*setagitemdoubleratio(valuespatial4); }}}/** * PREND LA VALEUR D'UN RATIO SPATIAL/PUT VALUE RATIO SPATIAL * @PARAM VALUESPATIAL */PUBLIC SETTAGITEMDOUBLERATIO(Double ValueSpatial) getValeurtagitemdoubleratio(){return Valuespatial; ** * donne les valeurs des puissances/ put and computing power * @param result * @return */ public static double setfacturpuissance } / ** * baleur de puissance / giving value power * @return * / public static geteurpuissance(){return resultfacteurdix; this.noununitratio = noununitratio; des items./giving unityアイテム * @return le nom del'inité */ public string getnoununitratio(){return noununitratio; }/ ** * prend la valeur interne d'un tag item/ put tag item * @param result * @return */ public string setagitem(string result){return this.result = result; }/** * donne la valeur du tag rachercher/giving of tag seek * @return le string de la valeur rachercher du tag dans un item */public string getvaleurtagitem(){return result; }/ ** * prend la valeur interne d'un tag item/ put the value tagitemシャート * @return */ public double setagitemdouble(double result2){return this.result2 = result2; }/** * donne la valeur du tag rachercher/value the value tag * @return le deol de la valeur rachercher du tag dans un item */public double getvaleurtagitemdouble(){return result2; } / ** *タグDICOM(DCM4CHE2)から文字列値を読み取ります * @Param Tagnrタグを読む * @return string * as speciound special set special set(0008,0005) *を返します。 elem = getobject(); ELEM.SETSPECIFICCHARACTERSET( "GB18030");文字列val = elem.getString(tagnr); if(val == null){val = ""; } valを返します。 } catch(例外e){return ""; }} / ** *タグDICOM(dcm4che2)から文字列値を読み取ります * @param tagnrタグを読む * @return stringとして値を読みます *これまたはルートデータセットで定義された特定の文字セット(0008,0005) *を返します。 System.out.println(222);属性elem = getobject(); ELEM.SETSPECIFICCHARACTERSET( "GB18030"); string [] val = elem.getStrings(tagnr); valを返します。 } catch(例外E){nullを返します。 }} / ** * dicomheaderの文字列値を読み取ります * @param tagnrタグを読む * @param dcmelement * @return sing * / public string getheaderstringvalue(属性dcmelement、int tagnr){try {system.out.out.println(333); /* dcmelement.setspecificCharacterset( "ISO_IR 100"); */ dcmelement.setspecificcharacterset( "gb18030"); string val = dcmelement.getString(tagnr); if(val == null){val = ""; } valを返します。 } catch(例外e){return ""; }} / ** *タグ(グループ、要素) * @param headernr eg "0018,0050"を読み取り、スライスの厚さ<br> * @return string * / public string getheaderstringvalue(string headernr){headernr = headernr.replaceall( "xx"、 "00")。 return getheaderstringvalue(totagint(headernr)); } / ** * tag( "xxxx、") * @param tagnr * @return * / public time getheadertimevalue(string tagnr){return getheadertimevalue(totagint(tagnr)); } / ** * tagを与える * @param tagnr * @return time * / public time getheadertimevalue(int tagnr){string time = getheaderstringvalue(tagnr); if(time.length()!= 6){return null; } try {int hour = integer.parseint(time.substring(0,2)); int min = integer.parseint(time.substring(2,4)); int sec = integer.parseint(time.substring(4,6));新しい時間(時間、分、秒)を返します。 } catch(例外e){} nullを返します。 } /** * Anotehrタグ内にある特定のヘッドテルタグ *または "0008,0102、0054,0220"を取得して、コードシーケンスの後にコーディングスキームデザイナーを取得します * @return string * * @param taghierarchy; Eg {tag.uid、tag.sopinstanceuid、tag.codemeneant} * @return */ public string getheadervalueinsidetag(int [] taghierarchy){try {for(int i = 0; i <taghierarchy.length-1; i ++){return getobject()。 }} catch(例外e){string tags = ""; for(int i = 0; i <taghierarchy.length; i ++){tags += totagstring(taghierarchy [i]) +""; } 戻る ""; } nullを返します。 } / ** *ヘッダー番号のint表現を変換します * Eg 0x00080010に対応する文字列0008,0010 * @return 0008,0010 As String * / public Static String totagString(int tagnr){return shorttohex(tagnr >> 16) + '、' + shorthex(tagnr); } public static string shorttohex(int val){char [] ch = new char [4]; shorttohex(val、ch、0);新しい文字列(ch)を返します。 } public static stringbuffer shorttohex(int val、stringbuffer sb){sb.append(hex_digits [(val >> 12)&0xf]); sb.append(hex_digits [(val >> 8)&0xf]); sb.append(hex_digits [(val >> 4)&0xf]); sb.append(hex_digits [val&0xf]); SBを返します。 } public static void shorttohex(int val、char [] ch、int off){ch [off] = hex_digits [(val >> 12)&0xf]; ch [off+1] = hex_digits [(val >> 8)&0xf]; ch [off+2] = hex_digits [(val >> 4)&0xf]; ch [off+3] = hex_digits [val&0xf]; } / ** *ファイル出力dicomの作成 * @param fileoutput:file output * @throws ioexception * * * * * * * * * * / public void writeto(file output、属性fmi、属性オブジェクト)Ioexception {dicomoutputStream dos = new dicomoutputtumputtuptuptuptuptuptuptuptuptuptuptup(dicomoutputstream ")をスローするdos.setencodingoptions(encopts); dos.writedataset(fmi、object); dos.finish(); dos.flush(); } / ** * writting * @param fileoutput * @param h * @param w * @throws ioexception * / public void writeTosegment(file output、int h、int w)throws ioexception {dicomoutputstream dos = new dicomoutputStream(new file(fileoutput +"); dos.setencodingoptions(encopts); } / ** * pixeldataでオーバーレイを作成 * @param object * / public void overlaycreate(astributes object){int position = object.getint(tag.overlaybitposition、0); if(position == 0){return; } int bit = 1 << position; int [] pixels = object.getints(tag.pixeldata); int count = 0; for(int pix:pixels){int overlay = pix&bit;ピクセル[count ++] = pix -overlay; } object.setint(tag.pixeldata、vr.ow、pixels); } /*** dicom.setString(tag.performingphysicianname、vr.pn、 "jean"); dicom.setString(tag.admittingdiagnosessdescription、vr.lo、 "chu");シーケンスseq = dicom.newsequence(tag.AnatomiceRion sequence、0);属性DICOM2 = new attributes(); * @param dicom */ public void setItem(属性dicom、int tag sequencename){sequence seq = dicom.newsequence(tag sequencencename、0); dicom.setString(tag.codingschemedesignator、vr.sh、 "srt"); dicom.setString(tag.codevalue、vr.sh、 "t-aa000"); dicom.setString(tag.codemenean、vr.lo、 "eye"); seq.add(dicom); } public static void main(string [] args)スロー例外{file file = new file( "c:// users // documents // wechat files // fen_do // files // 1234.dcm"); displaytag d = new displaytag(file); @suppresswarnings( "static-access")属性属性= d.loaddicomobject(file); //すべての属性情報System.out.println( "すべて情報:" + attrs); // get row int row = attrs.getint(tag.rows、1); //列int columns = attrs.getint(tag.columns、1)を取得します。 //ウィンドウ幅ウィンドウFLOAT WIN_CENTER = ATTRS.GETFLOAT(Tag.WindowCenter、1); float win_width = attrs.getFloat(Tag.WindowWidth, 1); System.out.println("" + "row=" + row + ",columns=" + row + ",row*columns = " + row * columns); String patientName = attrs.getString(Tag.PatientName, ""); System.out.println("姓名:" + patientName); //生日String patientBirthDate = attrs.getString(Tag.PatientBirthDate, ""); System.out.println("生日:" + patientBirthDate); //机构String institution = attrs.getString(Tag.InstitutionName, ""); System.out.println("机构:" + institution); //站点String station = attrs.getString(Tag.StationName, ""); System.out.println("站点:" + station); //制造商String Manufacturer = attrs.getString(Tag.Manufacturer, ""); System.out.println("制造商:" + Manufacturer); //制造商模型String ManufacturerModelName = attrs.getString(Tag.ManufacturerModelName, ""); System.out.println("制造商模型:" + ManufacturerModelName); //描述--心房String description = attrs.getString(Tag.StudyDescription, ""); System.out.println("描述--心房:" + description); //描述--具体String SeriesDescription = attrs.getString(Tag.SeriesDescription, ""); System.out.println("描述--具体:" + SeriesDescription); //描述时间String studyData = attrs.getString(Tag.StudyDate, ""); System.out.println("描述时间:" + studyData); byte[] bytename = attrs.getBytes(Tag.PatientName); System.out.println("姓名: " + new String(bytename,"gb18030")); byte[] bytesex = attrs.getBytes(Tag.PatientSex); System.out.println("性别: " + new String(bytesex,"gb18030")); }}输出如下:
所有信息: (0008,0005) CS [ISO_IR 100] SpecificCharacterSet
(0008,0008) CS [ORIGINAL/PRIMARY] ImageType
(0008,0016) UI [1.2.840.10008.5.1.4.1.1.1.1] SOPClassUID
(0008,0018) UI [1.2.840.113619.2.203.4.2147483647.1486521160.448521] SOPInstan
(0008,0020) DA [20170208] StudyDate
(0008,0021) DA [20170208] SeriesDate
(0008,0022) DA [20170208] AcquisitionDate
(0008,0023) DA [20170208] ContentDate
(0008,002A) DT [20170208103237.000000] AcquisitionDateTime
(0008,0030) TM [103154.000] StudyTime
(0008,0031) TM [103158.000] SeriesTime
(0008,0032) TM [103237.000] AcquisitionTime
(0008,0033) TM [103240.000] ContentTime
(0008,0050) SH [T77792] AccessionNumber
(0008,0060) CS [DX] Modality
(0008,0068) CS [FOR PRESENTATION] PresentationIntentType
(0008,0070) LO ["GE Healthcare"] Manufacturer
(0008,0080) LO [HeFei RICH] InstitutionName
(0008,0081) ST [Not Initialized
Not Initialized
HeFei
AnHui
Not Initialize(0008,0090) PN [] ReferringPhysicianName
(0008,1010) SH [082407110134] StationName
(0008,1030) LO [ACHEST] StudyDescription
(0008,103E) LO [Chest] SeriesDescription
(0008,1040) LO [Not Initialized] InstitutionalDepartmentName
(0008,1050) PN [] PerformingPhysicianName
(0008,1090) LO ["Definium 6000"] ManufacturerModelName
(0008,1110) SQ [] ReferencedStudySequence
(0008,1120) SQ [] ReferencedPatientSequence
(0008,2112) SQ [1 Items] SourceImageSequence
>Item #1
>(0008,1150) UI [1.2.840.10008.5.1.4.1.1.1.1.1] ReferencedSOPClassUID
>(0008,1155) UI [1.2.840.113619.2.203.4.2147483647.1486521157.927189] Referenc
(0008,2218) SQ [1 Items] AnatomicRegionSequence
>Item #1
>(0008,0100) SH [T-D3000] CodeValue
>(0008,0102) SH [SNM3] CodingSchemeDesignator
>(0008,0104) LO [Chest] CodeMeaning
(0010,0010) PN [zhang^xiao di] PatientName
(0010,0020) LO [T77792] PatientID
(0010,0030) DA [19860618] PatientBirthDate
(0010,0032) TM [] PatientBirthTime
(0010,0040) CS [F] PatientSex
(0010,1010) AS [030Y] PatientAge
(0010,1030) DS [] PatientWeight
(0011,0010) LO [GEMS_GDXE_FALCON_04]
(0011,1003) UI [1.2.840.113619.2.203.4.2147483647.1486521118.562807]
(0011,1004) CS [SE]
(0011,1005) UI [1.2.840.113619.2.203.4.2147483647.1486521152.970120]
(0011,1006) DS [0.083936]
(0011,1009) SL [0]
...
row=2021,columns=2021,row*columns = 4084441
姓名:zhang^xiao di
生日:19860618
机构:HeFei RICH
站点:082407110134
制造商:"GE Healthcare"
制造商模型:"Definium 6000"
描述--心房:ACHEST
描述--具体:Chest
描述时间:20170208
姓名: zhang^xiao di
性别: F
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》
この記事がみんなのJavaプログラミングに役立つことを願っています。