/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠDeep ĠLearning Ġproject Ġcontributors . ĠAll ĠRights ĠReserved . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin x . dl . dataset . image Ċ Ċ import Ġorg . jetbrains . kotlin x . dl . dataset . On Heap Dataset Ċ import Ġorg . jetbrains . kotlin x . dl . dataset . preprocessor . image . Convert Ċ import Ġjava . awt . image . Buffered Image Ċ import Ġjava . awt . image . Data Buffer Byte Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjavax . image io . Image IO ĊĊ Ċ /** ĠHelper Ġobject Ġto Ġconvert Ġimages Ġto Ġ[ Float Array ]. Ġ*/ Ċ public Ġobject ĠImage Converter Ġ{ ĊĠĠĠ Ġ/** ĠAll Ġpixels Ġhas Ġvalues Ġin Ġrange Ġ[ 0 ; Ġ 2 5 5 ]. Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġto Raw Float Array ( image : ĠBufferedImage , Ġcolor Mode : ĠColor Mode ? Ġ= Ġnull ): ĠFloat Array Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġimage To Float Array ( image , Ġcolor Mode ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAll Ġpixels Ġhas Ġvalues Ġin Ġrange Ġ[ 0 ; Ġ 2 5 5 ]. Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġto Raw Float Array ( inputStream : ĠInputStream , Ġcolor Mode : ĠColor Mode ? Ġ= Ġnull ): ĠFloat Array Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġto Raw Float Array ( to Buffered Image ( inputStream ), Ġcolor Mode ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAll Ġpixels Ġhas Ġvalues Ġin Ġrange Ġ[ 0 ; Ġ 2 5 5 ]. Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġto Raw Float Array ( image File : ĠFile , Ġcolor Mode : ĠColor Mode ? Ġ= Ġnull ): ĠFloat Array Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġimage File . inputStream (). use Ġ{ Ġto Raw Float Array ( it , Ġcolor Mode ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAll Ġpixels Ġin Ġrange Ġ[ 0 ; 1 ) Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġto Normalized Float Array ( image : ĠBufferedImage , Ġcolor Mode : ĠColor Mode ? Ġ= Ġnull ): ĠFloat Array Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġto Raw Float Array ( image , Ġcolor Mode ). also Ġ{ Ġnormalize ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAll Ġpixels Ġin Ġrange Ġ[ 0 ; 1 ) Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġto Normalized Float Array ( inputStream : ĠInputStream , Ġcolor Mode : ĠColor Mode ? Ġ= Ġnull ): ĠFloat Array Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġto Normalized Float Array ( to Buffered Image ( inputStream ), Ġcolor Mode ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAll Ġpixels Ġin Ġrange Ġ[ 0 ; 1 ) Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġto Normalized Float Array ( image File : ĠFile , Ġcolor Mode : ĠColor Mode ? Ġ= Ġnull ): ĠFloat Array Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġimage File . inputStream (). use Ġ{ Ġto Normalized Float Array ( it , Ġcolor Mode ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġ[ Buffered Image ] Ġextracted Ġfrom Ġ[ inputStream ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġpublic Ġfun Ġto Buffered Image ( inputStream : ĠInputStream ): ĠBufferedImage Ġ{ ĊĠĠĠĠĠĠĠ ĠImage IO . set Use Cache ( false ) ĊĠĠĠĠĠĠĠ Ġreturn ĠImage IO . read ( inputStream ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsupported Image Types Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠ ĠBufferedImage . TYPE _ 3 BYTE _ BGR , ĠBufferedImage . TYPE _ INT _ BGR , ĊĠĠĠĠĠĠĠ ĠBufferedImage . TYPE _ INT _ RGB , ĠBufferedImage . TYPE _ BYTE _ GRAY ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġimage To Float Array ( image : ĠBufferedImage , Ġcolor Mode : ĠColor Mode ?): ĠFloat Array Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( color Mode Ġ!= Ġnull Ġ&& Ġimage . color Mode () Ġ!= Ġcolor Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġimage To Float Array ( Convert ( color Mode Ġ= Ġcolor Mode ). apply ( image )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġimage To Float Array ( image ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġimage To Float Array ( image : ĠBufferedImage ): ĠFloat Array Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( image . alpha Raster Ġ== Ġnull ) Ġ{ Ġ" Images Ġwith Ġalpha Ġchannels Ġare Ġnot Ġsupported Ġyet !" Ġ} ĊĠĠĠĠĠĠĠ Ġcheck ( supported Image Types . contains ( image . type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Images Ġwith Ġtype Ġ${ image . type } Ġare Ġnot Ġsupported Ġyet . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Supported Ġtypes Ġare : Ġ$ supported Image Types . ĠSee Ġalso Ġ` java . awt . image . Buffered Image . getType `. " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġraster Ġ= Ġimage . raster ĊĠĠĠĠĠĠĠ Ġif Ġ( raster . data Buffer Ġis ĠData Buffer Byte ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠOn Heap Dataset . to Raw Vector (( raster . data Buffer Ġas ĠData Buffer Byte ). data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠFloat Array ( raster . num B ands Ġ* Ġraster . width Ġ* Ġraster . height ) ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġraster . get Pixels ( 0 , Ġ 0 , Ġraster . width , Ġraster . height , Ġbuffer ) ĊĠĠĠĠĠĠĠ Ġif Ġ( image . color Mode () Ġ== ĠColor Mode . BGR ) Ġ{ Ġ// Ġget Pixels Ġreturns Ġdata Ġin ĠRGB Ġorder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġswap Rand B ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġswap Rand B ( res : ĠFloat Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġres . indices Ġstep Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġres [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres [ i ] Ġ= Ġres [ i Ġ+ Ġ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres [ i Ġ+ Ġ 2 ] Ġ= Ġtmp ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnormalize ( data : ĠFloat Array , Ġscale : ĠFloat Ġ= Ġ 2 5 5 . 0 f ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġdata . indices ) Ġdata [ i ] Ġ/= Ġscale ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠConverts Ġ[ image ] Ġwith Ġ[ color Mode ] Ġto Ġthe Ġ 3 D Ġarray . Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġimage To 3 D Float Array ( ĊĠĠĠĠĠĠĠ Ġimage : ĠBufferedImage , ĊĠĠĠĠĠĠĠ Ġcolor Mode : ĠColor Mode Ġ= ĠColor Mode . BGR ĊĠĠĠ Ġ): ĠArray < Array < Float Array >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpixels Ġ= Ġ( image . raster . data Buffer Ġas ĠData Buffer Byte ). data ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġimage . width ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġimage . height ĊĠĠĠĠĠĠĠ Ġval Ġhas Alpha Channel Ġ= Ġimage . alpha Raster Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġlast Dimensions Ġ= Ġif Ġ( has Alpha Channel ) Ġ 4 Ġelse Ġ 3 ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠArray ( height ) Ġ{ ĠArray ( width ) Ġ{ ĠFloat Array ( last Dimensions ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( has Alpha Channel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpixel Length Ġ= Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpixel Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrow Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcol Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( pixel Ġ< Ġpixels . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ row ][ col ][ 3 ] Ġ= Ġ( pixels [ pixel ]. toInt () Ġand Ġ 0 xff Ġshl Ġ 2 4 ). toFloat () Ġ// Ġalpha ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ row ][ col ][ 0 ] Ġ= Ġ( pixels [ pixel Ġ+ Ġ 1 ]. toInt () Ġand Ġ 0 xff ). toFloat () Ġ// Ġblue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( color Mode Ġ== ĠColor Mode . RGB ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ row ][ col ][ 1 ] Ġ= Ġ( pixels [ pixel Ġ+ Ġ 2 ]. toInt () Ġand Ġ 0 xff Ġshl Ġ 8 ). toFloat () Ġ// Ġgreen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ row ][ col ][ 2 ] Ġ= Ġ( pixels [ pixel Ġ+ Ġ 3 ]. toInt () Ġand Ġ 0 xff Ġshl Ġ 1 6 ). toFloat () Ġ// Ġred ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ row ][ col ][ 2 ] Ġ= Ġ( pixels [ pixel Ġ+ Ġ 2 ]. toInt () Ġand Ġ 0 xff Ġshl Ġ 8 ). toFloat () Ġ// Ġgreen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ row ][ col ][ 1 ] Ġ= Ġ( pixels [ pixel Ġ+ Ġ 3 ]. toInt () Ġand Ġ 0 xff Ġshl Ġ 1 6 ). toFloat () Ġ// Ġred ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcol ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( col Ġ== Ġwidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcol Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpixel Ġ+= Ġpixel Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpixel Length Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpixel Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrow Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcol Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( pixel Ġ< Ġpixels . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ row ][ col ][ 0 ] Ġ= Ġ( pixels [ pixel ]. toInt () Ġand Ġ 0 xff ). toFloat () Ġ// Ġblue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( color Mode Ġ== ĠColor Mode . RGB ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ row ][ col ][ 1 ] Ġ= Ġ( pixels [ pixel Ġ+ Ġ 1 ]. toInt () Ġand Ġ 0 xff Ġshl Ġ 8 ). toFloat () Ġ// Ġgreen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ row ][ col ][ 2 ] Ġ= Ġ( pixels [ pixel Ġ+ Ġ 2 ]. toInt () Ġand Ġ 0 xff Ġshl Ġ 1 6 ). toFloat () Ġ// Ġred ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ row ][ col ][ 2 ] Ġ= Ġ( pixels [ pixel Ġ+ Ġ 1 ]. toInt () Ġand Ġ 0 xff Ġshl Ġ 8 ). toFloat () Ġ// Ġgreen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ row ][ col ][ 1 ] Ġ= Ġ( pixels [ pixel Ġ+ Ġ 2 ]. toInt () Ġand Ġ 0 xff Ġshl Ġ 1 6 ). toFloat () Ġ// Ġred ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcol ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( col Ġ== Ġwidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcol Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpixel Ġ+= Ġpixel Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠRepresents Ġthe Ġnumber Ġand Ġorder Ġof Ġcolor Ġchannels Ġin Ġthe Ġimage Ġ*/ Ċ public Ġenum Ġclass ĠColor Mode ( public Ġval Ġchannels : ĠInt ) Ġ{ ĊĠĠĠ Ġ/** ĠRed , Ġgreen , Ġblue . Ġ*/ ĊĠĠĠ ĠRGB ( 3 ), ĊĊĠĠĠ Ġ/** ĠBlue , Ġgreen , Ġred . Ġ*/ ĊĠĠĠ ĠB GR ( 3 ), ĊĊĠĠĠ Ġ/** ĠGray scale Ġ**/ ĊĠĠĠ ĠGR AY SCALE ( 1 ) Ċ } Ċ Ċ internal Ġfun ĠBufferedImage . color Mode (): ĠColor Mode Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠBufferedImage . TYPE _ INT _ RGB Ġ-> ĠColor Mode . RGB ĊĠĠĠĠĠĠĠ ĠBufferedImage . TYPE _ 3 BYTE _ BGR , ĠBufferedImage . TYPE _ INT _ BGR Ġ-> ĠColor Mode . BGR ĊĠĠĠĠĠĠĠ ĠBufferedImage . TYPE _ BYTE _ GRAY Ġ-> ĠColor Mode . GRAY SCALE ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException (" Images Ġwith Ġtype Ġ$ type Ġare Ġnot Ġsupported .") ĊĠĠĠ Ġ} Ċ } Ċ Ċ public Ġfun ĠColor Mode . image Type (): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ ĠColor Mode . RGB Ġ-> ĠBufferedImage . TYPE _ INT _ RGB ĊĠĠĠĠĠĠĠ ĠColor Mode . BGR Ġ-> ĠBufferedImage . TYPE _ 3 BYTE _ BGR ĊĠĠĠĠĠĠĠ ĠColor Mode . GRAY SCALE Ġ-> ĠBufferedImage . TYPE _ BYTE _ GRAY ĊĠĠĠ Ġ} Ċ } Ċ