From: Greg Burri Date: Tue, 2 Jun 2015 19:33:39 +0000 (+0200) Subject: * Suppression de l'essai avec XAML+Emgu+F# X-Git-Url: https://git.euphorik.ch/?a=commitdiff_plain;h=1413d7312754526d23480920ba0e4b3d43bb595f;p=malaria.git * Suppression de l'essai avec XAML+Emgu+F# * Mise à jour du rapport --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..70dc36a --- /dev/null +++ b/.gitignore @@ -0,0 +1,190 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +x64/ +build/ +bld/ +[Bb]in/ +[Oo]bj/ + +# Roslyn cache directories +*.ide/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +#NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding addin-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +## TODO: Comment the next line if you want to checkin your +## web deploy settings but do note that will include unencrypted +## passwords +#*.pubxml + +# NuGet Packages Directory +packages/* +## TODO: If the tool you use requires repositories.config +## uncomment the next line +#!packages/repositories.config + +# Enable "build/" folder in the NuGet Packages folder since +# NuGet packages use it for MSBuild targets. +# This line needs to be after the ignore of the build folder +# (and the packages folder if the line above has been uncommented) +!packages/build/ + +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml \ No newline at end of file diff --git a/2002-DiRuberto.pdf b/2002-DiRuberto.pdf deleted file mode 100644 index 454d160..0000000 Binary files a/2002-DiRuberto.pdf and /dev/null differ diff --git a/Parasitemia/Parasitemia.sln b/Parasitemia/Parasitemia.sln deleted file mode 100644 index 983f997..0000000 --- a/Parasitemia/Parasitemia.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.22823.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Parasitemia", "Parasitemia\Parasitemia.fsproj", "{70838E65-F211-44FC-B28F-0ED1CA6E850F}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {70838E65-F211-44FC-B28F-0ED1CA6E850F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {70838E65-F211-44FC-B28F-0ED1CA6E850F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {70838E65-F211-44FC-B28F-0ED1CA6E850F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {70838E65-F211-44FC-B28F-0ED1CA6E850F}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Parasitemia/Parasitemia/App.config b/Parasitemia/Parasitemia/App.config deleted file mode 100644 index e6cb850..0000000 --- a/Parasitemia/Parasitemia/App.config +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Parasitemia/Parasitemia/AssemblyInfo.fs b/Parasitemia/Parasitemia/AssemblyInfo.fs deleted file mode 100644 index 269e427..0000000 --- a/Parasitemia/Parasitemia/AssemblyInfo.fs +++ /dev/null @@ -1,41 +0,0 @@ -namespace Parasitemia.AssemblyInfo - -open System.Reflection -open System.Runtime.CompilerServices -open System.Runtime.InteropServices - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[] -[] -[] -[] -[] -[] -[] -[] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [] -[] -[] - -do - () \ No newline at end of file diff --git a/Parasitemia/Parasitemia/MainWindow.xaml b/Parasitemia/Parasitemia/MainWindow.xaml deleted file mode 100644 index 8578d8c..0000000 --- a/Parasitemia/Parasitemia/MainWindow.xaml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/Parasitemia/Parasitemia/MainWindow.xaml.fs b/Parasitemia/Parasitemia/MainWindow.xaml.fs deleted file mode 100644 index 26d30c9..0000000 --- a/Parasitemia/Parasitemia/MainWindow.xaml.fs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Parasitemia.Views - -open FsXaml - -type MainWindow = XAML<"MainWindow.xaml"> - diff --git a/Parasitemia/Parasitemia/Parasitemia.fsproj b/Parasitemia/Parasitemia/Parasitemia.fsproj deleted file mode 100644 index c071e66..0000000 --- a/Parasitemia/Parasitemia/Parasitemia.fsproj +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - Debug - AnyCPU - 2.0 - 70838e65-f211-44fc-b28f-0ed1ca6e850f - WinExe - Parasitemia - Parasitemia - v4.6 - true - 4.4.0.0 - Parasitemia - - - - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - x64 - bin\Debug\Parasitemia.XML - false - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - x64 - bin\Release\Parasitemia.XML - false - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - - - - - - - - ..\..\..\Programs\Emgu\emgucv-windows-universal 3.0.0.2032\bin\Emgu.CV.dll - - - ..\..\..\Programs\Emgu\emgucv-windows-universal 3.0.0.2032\bin\Emgu.CV.WPF.exe - - - ..\..\..\Programs\Emgu\emgucv-windows-universal 3.0.0.2032\bin\Emgu.Util.dll - - - ..\packages\FsXaml.Wpf.0.9.9\lib\net45\FsXaml.Wpf.dll - True - - - ..\packages\FsXaml.Wpf.0.9.9\lib\net45\FsXaml.Wpf.TypeProvider.dll - True - - - - True - - - - - - - - - ..\packages\Expression.Blend.Sdk.1.0.2\lib\net45\System.Windows.Interactivity.dll - True - - - - - - - xcopy "D:\Programs\Emgu\emgucv-windows-universal 3.0.0.2032\bin\x64\*" $(TargetDir) /Y /D - - - \ No newline at end of file diff --git a/Parasitemia/Parasitemia/Program.fs b/Parasitemia/Parasitemia/Program.fs deleted file mode 100644 index e9ae0d4..0000000 --- a/Parasitemia/Parasitemia/Program.fs +++ /dev/null @@ -1,68 +0,0 @@ -module Parasitemia.Main - -open System.IO -open System.Windows -open System.Windows.Media -open System.Windows.Markup -open System.Windows.Shapes -open System.Windows.Controls -open System.Drawing -open System.Diagnostics - -open Emgu.CV -open Emgu.CV.Structure -open Emgu.CV.WPF - -let display (window : Views.MainWindow) (img : IImage) = - let imgControl = window.Root.FindName("img") :?> Controls.Image - imgControl.Source <- BitmapSourceConvert.ToBitmapSource(img) - -let log (window : Views.MainWindow) (mess : string) = - let txtLog = window.Root.FindName("txtLog") :?> Controls.TextBlock - txtLog.Text <- txtLog.Text + mess + "\n" - -let inline dprintfn fmt = - Printf.ksprintf System.Diagnostics.Debug.WriteLine fmt - -let measureTime<'a> (print : string -> unit) (f : unit -> 'a) = - let sw = Stopwatch() - sw.Start() - let res = f () - sw.Stop() - print <| sprintf "time: %A ms" sw.ElapsedMilliseconds - res - -[] -do - dprintfn "OpenCV test" - - let app = new Application() - - let mainWindow = Views.MainWindow() - - let timer = measureTime (log mainWindow) - - use image = new Image("../../../../imgs_corrMK/1412151257/1412151257-Gamma-0.8-0002.png") - - use scaledImage = image.Resize(0.6, CvEnum.Inter.Area) - - use imageHSV = scaledImage.Convert() - let H, S = match imageHSV.Split() with // Warning: H is from 0 to 179°. - | [| H; S; _|] -> H, S - | _ -> failwith "unable to split the HSV channels" - - let hueShiftValue = 175 - // Modulo operator doesn't exist on matrix thus we have to apply a function to every pixels. - let correctedH : Image = H.Convert(fun b _ _ -> - (255 - int(b) * 255 / 179 + hueShiftValue) % 256 |> byte - ) - - let correctedS : Image = S.Not() - - let filteredH = correctedH.SmoothMedian(5) - let filteredS = correctedS.SmoothMedian(5) - - display mainWindow filteredS - mainWindow.Root.Show() - - app.Run() |> ignore diff --git a/Parasitemia/Parasitemia/packages.config b/Parasitemia/Parasitemia/packages.config deleted file mode 100644 index 9ac3914..0000000 --- a/Parasitemia/Parasitemia/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/rapport/img/imgHFiltered.jpg b/rapport/img/imgHFiltered.jpg index 68ddcd4..1959057 100644 Binary files a/rapport/img/imgHFiltered.jpg and b/rapport/img/imgHFiltered.jpg differ diff --git a/rapport/img/imgSFiltered.jpg b/rapport/img/imgSFiltered.jpg index 9770cf4..37f5042 100644 Binary files a/rapport/img/imgSFiltered.jpg and b/rapport/img/imgSFiltered.jpg differ diff --git a/rapport/img/pattern_spectrum_granulometry.eps b/rapport/img/pattern_spectrum_granulometry.eps index 7310bc3..558f5e8 100644 --- a/rapport/img/pattern_spectrum_granulometry.eps +++ b/rapport/img/pattern_spectrum_granulometry.eps @@ -1,9 +1,9 @@ %!PS-Adobe-3.0 EPSF-3.0 %%Creator: (MATLAB, The Mathworks, Inc. Version 8.5.0.197613 \(R2015a\). Operating System: Windows 8) %%Title: D:/PA/rapport/img/pattern_spectrum_granulometry.eps -%%CreationDate: 2015-05-29T17:48:39 +%%CreationDate: 2015-06-02T11:50:36 %%Pages: (atend) -%%BoundingBox: 0 0 420 315 +%%BoundingBox: 0 0 420 316 %%LanguageLevel: 2 %%EndComments %%BeginProlog @@ -1289,257 +1289,257 @@ end %FOPEndFontReencode %%EndProlog %%Page: 1 1 -%%PageBoundingBox: 0 0 420 315 +%%PageBoundingBox: 0 0 420 316 %%BeginPageSetup -[1 0 0 -1 0 315] CT +[1 0 0 -1 0 316] CT %%EndPageSetup GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 1 GC N -0 0 560 420 re +0 0 560 421 re f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 1 GC N -0 0 560 420 re +0 0 560 421 re f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 1 GC N -73 374 M -507 374 L -507 31 L -73 31 L +73 375 M +507 375 L +507 32 L +73 32 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -73 374 M -507 374 L +73 375 M +507 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -73 31 M -507 31 L +73 32 M +507 32 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -73 374 M -73 369.66 L +73 375 M +73 370.66 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -121.222 374 M -121.222 369.66 L +121.222 375 M +121.222 370.66 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -169.444 374 M -169.444 369.66 L +169.444 375 M +169.444 370.66 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -217.667 374 M -217.667 369.66 L +217.667 375 M +217.667 370.66 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -265.889 374 M -265.889 369.66 L +265.889 375 M +265.889 370.66 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -314.111 374 M -314.111 369.66 L +314.111 375 M +314.111 370.66 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -362.333 374 M -362.333 369.66 L +362.333 375 M +362.333 370.66 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -410.556 374 M -410.556 369.66 L +410.556 375 M +410.556 370.66 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -458.778 374 M -458.778 369.66 L +458.778 375 M +458.778 370.66 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -507 374 M -507 369.66 L +507 375 M +507 370.66 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -73 31 M -73 35.34 L +73 32 M +73 36.34 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -121.222 31 M -121.222 35.34 L +121.222 32 M +121.222 36.34 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -169.444 31 M -169.444 35.34 L +169.444 32 M +169.444 36.34 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -217.667 31 M -217.667 35.34 L +217.667 32 M +217.667 36.34 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -265.889 31 M -265.889 35.34 L +265.889 32 M +265.889 36.34 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -314.111 31 M -314.111 35.34 L +314.111 32 M +314.111 36.34 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -362.333 31 M -362.333 35.34 L +362.333 32 M +362.333 36.34 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -410.556 31 M -410.556 35.34 L +410.556 32 M +410.556 36.34 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -458.778 31 M -458.778 35.34 L +458.778 32 M +458.778 36.34 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -507 31 M -507 35.34 L +507 32 M +507 36.34 L S GR GS -[0.75 0 0 0.75 54.75 284.50001] CT +[0.75 0 0 0.75 54.75 285.50001] CT 0.149 GC /Helvetica 13 F GS @@ -1550,7 +1550,7 @@ GS GR GR GS -[0.75 0 0 0.75 90.91667 284.50001] CT +[0.75 0 0 0.75 90.91667 285.50001] CT 0.149 GC /Helvetica 13 F GS @@ -1561,7 +1561,7 @@ GS GR GR GS -[0.75 0 0 0.75 127.08333 284.50001] CT +[0.75 0 0 0.75 127.08333 285.50001] CT 0.149 GC /Helvetica 13 F GS @@ -1572,7 +1572,7 @@ GS GR GR GS -[0.75 0 0 0.75 163.25 284.50001] CT +[0.75 0 0 0.75 163.25 285.50001] CT 0.149 GC /Helvetica 13 F GS @@ -1583,7 +1583,7 @@ GS GR GR GS -[0.75 0 0 0.75 199.41666 284.50001] CT +[0.75 0 0 0.75 199.41666 285.50001] CT 0.149 GC /Helvetica 13 F GS @@ -1594,7 +1594,7 @@ GS GR GR GS -[0.75 0 0 0.75 235.58334 284.50001] CT +[0.75 0 0 0.75 235.58334 285.50001] CT 0.149 GC /Helvetica 13 F GS @@ -1605,7 +1605,7 @@ GS GR GR GS -[0.75 0 0 0.75 271.75001 284.50001] CT +[0.75 0 0 0.75 271.75001 285.50001] CT 0.149 GC /Helvetica 13 F GS @@ -1616,7 +1616,7 @@ GS GR GR GS -[0.75 0 0 0.75 307.91666 284.50001] CT +[0.75 0 0 0.75 307.91666 285.50001] CT 0.149 GC /Helvetica 13 F GS @@ -1627,7 +1627,7 @@ GS GR GR GS -[0.75 0 0 0.75 344.08333 284.50001] CT +[0.75 0 0 0.75 344.08333 285.50001] CT 0.149 GC /Helvetica 13 F GS @@ -1638,7 +1638,7 @@ GS GR GR GS -[0.75 0 0 0.75 380.25 284.50001] CT +[0.75 0 0 0.75 380.25 285.50001] CT 0.149 GC /Helvetica 13 F GS @@ -1649,7 +1649,7 @@ GS GR GR GS -[0.75 0 0 0.75 54.75 21] CT +[0.75 0 0 0.75 54.75 22] CT 0.149 GC /mwb_cmsy10 13 F GS @@ -1660,7 +1660,7 @@ GS GR GR GS -[0.75 0 0 0.75 63 21] CT +[0.75 0 0 0.75 63 22] CT 0.149 GC /Helvetica 13 F GS @@ -1671,7 +1671,7 @@ GS GR GR GS -[0.75 0 0 0.75 74.25 16.5] CT +[0.75 0 0 0.75 74.25 17.5] CT 0.149 GC /Helvetica 11 F GS @@ -1682,187 +1682,247 @@ GS GR GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -73 374 M -73 31 L +73 375 M +73 32 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -507 374 M -507 31 L +507 375 M +507 32 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -73 374 M -77.34 374 L +73 375 M +77.34 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -73 325 M -77.34 325 L +73 340.7 M +77.34 340.7 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -73 276 M -77.34 276 L +73 306.4 M +77.34 306.4 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -73 227 M -77.34 227 L +73 272.1 M +77.34 272.1 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -73 178 M -77.34 178 L +73 237.8 M +77.34 237.8 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -73 129 M -77.34 129 L +73 203.5 M +77.34 203.5 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -73 80 M -77.34 80 L +73 169.2 M +77.34 169.2 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -73 31 M -77.34 31 L +73 134.9 M +77.34 134.9 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -507 374 M -502.66 374 L +73 100.6 M +77.34 100.6 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -507 325 M -502.66 325 L +73 66.3 M +77.34 66.3 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -507 276 M -502.66 276 L +73 32 M +77.34 32 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -507 227 M -502.66 227 L +507 375 M +502.66 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -507 178 M -502.66 178 L +507 340.7 M +502.66 340.7 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -507 129 M -502.66 129 L +507 306.4 M +502.66 306.4 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -507 80 M -502.66 80 L +507 272.1 M +502.66 272.1 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -507 31 M -502.66 31 L +507 237.8 M +502.66 237.8 L S GR GS -[0.75 0 0 0.75 50.75 280.5] CT +[0.75 0 0 0.75 0 0.25] CT +0.149 GC +2 setlinecap +10.0 ML +N +507 203.5 M +502.66 203.5 L +S +GR +GS +[0.75 0 0 0.75 0 0.25] CT +0.149 GC +2 setlinecap +10.0 ML +N +507 169.2 M +502.66 169.2 L +S +GR +GS +[0.75 0 0 0.75 0 0.25] CT +0.149 GC +2 setlinecap +10.0 ML +N +507 134.9 M +502.66 134.9 L +S +GR +GS +[0.75 0 0 0.75 0 0.25] CT +0.149 GC +2 setlinecap +10.0 ML +N +507 100.6 M +502.66 100.6 L +S +GR +GS +[0.75 0 0 0.75 0 0.25] CT +0.149 GC +2 setlinecap +10.0 ML +N +507 66.3 M +502.66 66.3 L +S +GR +GS +[0.75 0 0 0.75 0 0.25] CT +0.149 GC +2 setlinecap +10.0 ML +N +507 32 M +502.66 32 L +S +GR +GS +[0.75 0 0 0.75 50.75 281.5] CT 0.149 GC /Helvetica 13 F GS @@ -1873,7 +1933,7 @@ GS GR GR GS -[0.75 0 0 0.75 50.75 243.75] CT +[0.75 0 0 0.75 50.75 255.77501] CT 0.149 GC /Helvetica 13 F GS @@ -1884,7 +1944,7 @@ GS GR GR GS -[0.75 0 0 0.75 50.75 207] CT +[0.75 0 0 0.75 50.75 230.05] CT 0.149 GC /Helvetica 13 F GS @@ -1895,7 +1955,7 @@ GS GR GR GS -[0.75 0 0 0.75 50.75 170.25] CT +[0.75 0 0 0.75 50.75 204.325] CT 0.149 GC /Helvetica 13 F GS @@ -1906,7 +1966,7 @@ GS GR GR GS -[0.75 0 0 0.75 50.75 133.49999] CT +[0.75 0 0 0.75 50.75 178.59999] CT 0.149 GC /Helvetica 13 F GS @@ -1917,7 +1977,7 @@ GS GR GR GS -[0.75 0 0 0.75 50.75 96.75] CT +[0.75 0 0 0.75 50.75 152.875] CT 0.149 GC /Helvetica 13 F GS @@ -1928,7 +1988,7 @@ GS GR GR GS -[0.75 0 0 0.75 50.75 60] CT +[0.75 0 0 0.75 50.75 127.15] CT 0.149 GC /Helvetica 13 F GS @@ -1939,7 +1999,7 @@ GS GR GR GS -[0.75 0 0 0.75 50.75 23.24999] CT +[0.75 0 0 0.75 50.75 101.425] CT 0.149 GC /Helvetica 13 F GS @@ -1950,959 +2010,992 @@ GS GR GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 50.75 75.69999] CT +0.149 GC +/Helvetica 13 F +GS +[1 0 0 1 0 0] CT +-8 5.5 moveto +1 -1 scale +(4) t +GR +GR +GS +[0.75 0 0 0.75 50.75 49.97501] CT +0.149 GC +/Helvetica 13 F +GS +[1 0 0 1 0 0] CT +-19 5.5 moveto +1 -1 scale +(4.5) t +GR +GR +GS +[0.75 0 0 0.75 50.75 24.25001] CT +0.149 GC +/Helvetica 13 F +GS +[1 0 0 1 0 0] CT +-8 5.5 moveto +1 -1 scale +(5) t +GR +GR +GS +[0.75 0 0 0.75 0 0.25] CT N -79.751 374 M -85.538 374 L -85.538 302.389 L -79.751 302.389 L +79.751 375 M +85.538 375 L +85.538 348.895 L +79.751 348.895 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -89.396 374 M -95.182 374 L -95.182 262.82 L -89.396 262.82 L +89.396 375 M +95.182 375 L +95.182 342.831 L +89.396 342.831 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -99.04 374 M -104.827 374 L -104.827 210.492 L -99.04 210.492 L +99.04 375 M +104.827 375 L +104.827 336.342 L +99.04 336.342 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -108.684 374 M -114.471 374 L -114.471 268.338 L -108.684 268.338 L +108.684 375 M +114.471 375 L +114.471 351.018 L +108.684 351.018 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -118.329 374 M -124.116 374 L -124.116 232.797 L -118.329 232.797 L +118.329 375 M +124.116 375 L +124.116 339.036 L +118.329 339.036 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -127.973 374 M -133.76 374 L -133.76 257.263 L -127.973 257.263 L +127.973 375 M +133.76 375 L +133.76 338.974 L +127.973 338.974 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -137.618 374 M -143.404 374 L -143.404 216.686 L -137.618 216.686 L +137.618 375 M +143.404 375 L +143.404 323.504 L +137.618 323.504 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -147.262 374 M -153.049 374 L -153.049 260.387 L -147.262 260.387 L +147.262 375 M +153.049 375 L +153.049 343.952 L +147.262 343.952 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -156.907 374 M -162.693 374 L -162.693 204.732 L -156.907 204.732 L +156.907 375 M +162.693 375 L +162.693 333.247 L +156.907 333.247 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -166.551 374 M -172.338 374 L -172.338 241.331 L -166.551 241.331 L +166.551 375 M +172.338 375 L +172.338 345.562 L +166.551 345.562 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -176.196 374 M -181.982 374 L -181.982 171.463 L -176.196 171.463 L +176.196 375 M +181.982 375 L +181.982 334.21 L +176.196 334.21 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -185.84 374 M -191.627 374 L -191.627 221.833 L -185.84 221.833 L +185.84 375 M +191.627 375 L +191.627 349.335 L +185.84 349.335 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -195.484 374 M -201.271 374 L -201.271 145.701 L -195.484 145.701 L +195.484 375 M +201.271 375 L +201.271 342.891 L +195.484 342.891 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -205.129 374 M -210.916 374 L -210.916 201.14 L -205.129 201.14 L +205.129 375 M +210.916 375 L +210.916 354.37 L +205.129 354.37 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -214.773 374 M -220.56 374 L -220.56 129.423 L -214.773 129.423 L +214.773 375 M +220.56 375 L +220.56 347.02 L +214.773 347.02 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -224.418 374 M -230.204 374 L -230.204 188.688 L -224.418 188.688 L +224.418 375 M +230.204 375 L +230.204 357.972 L +224.418 357.972 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -234.062 374 M -239.849 374 L -239.849 145.35 L -234.062 145.35 L +234.062 375 M +239.849 375 L +239.849 348.885 L +234.062 348.885 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -243.707 374 M -249.493 374 L -249.493 215.786 L -243.707 215.786 L +243.707 375 M +249.493 375 L +249.493 356.327 L +243.707 356.327 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -253.351 374 M -259.138 374 L -259.138 171.034 L -253.351 171.034 L +253.351 375 M +259.138 375 L +259.138 345.762 L +253.351 345.762 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -262.996 374 M -268.782 374 L -268.782 245.361 L -262.996 245.361 L +262.996 375 M +268.782 375 L +268.782 356.867 L +262.996 356.867 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -272.64 374 M -278.427 374 L -278.427 213.899 L -272.64 213.899 L +272.64 375 M +278.427 375 L +278.427 339.529 L +272.64 339.529 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -282.284 374 M -288.071 374 L -288.071 280.661 L -282.284 280.661 L +282.284 375 M +288.071 375 L +288.071 344.13 L +282.284 344.13 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -291.929 374 M -297.716 374 L -297.716 249.474 L -291.929 249.474 L +291.929 375 M +297.716 375 L +297.716 326.26 L +291.929 326.26 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -301.573 374 M -307.36 374 L -307.36 288.382 L -301.573 288.382 L +301.573 375 M +307.36 375 L +307.36 339.906 L +301.573 339.906 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -311.218 374 M -317.004 374 L -317.004 277.695 L -311.218 277.695 L +311.218 375 M +317.004 375 L +317.004 308.181 L +311.218 308.181 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -320.862 374 M -326.649 374 L -326.649 294.076 L -320.862 294.076 L +320.862 375 M +326.649 375 L +326.649 315.884 L +320.862 315.884 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -330.507 374 M -336.293 374 L -336.293 263.943 L -330.507 263.943 L +330.507 375 M +336.293 375 L +336.293 271.453 L +330.507 271.453 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -340.151 374 M -345.938 374 L -345.938 303.034 L -340.151 303.034 L +340.151 375 M +345.938 375 L +345.938 296.266 L +340.151 296.266 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -349.796 374 M -355.582 374 L -355.582 234.126 L -349.796 234.126 L +349.796 375 M +355.582 375 L +355.582 223.404 L +349.796 223.404 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -359.44 374 M -365.227 374 L -365.227 279.865 L -359.44 279.865 L +359.44 375 M +365.227 375 L +365.227 281.048 L +359.44 281.048 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -369.084 374 M -374.871 374 L -374.871 223.377 L -369.084 223.377 L +369.084 375 M +374.871 375 L +374.871 161.078 L +369.084 161.078 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -378.729 374 M -384.516 374 L -384.516 255.298 L -378.729 255.298 L +378.729 375 M +384.516 375 L +384.516 225.155 L +378.729 225.155 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -388.373 374 M -394.16 374 L -394.16 167.594 L -388.373 167.594 L +388.373 375 M +394.16 375 L +394.16 98.742 L +388.373 98.742 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -398.018 374 M -403.804 374 L -403.804 228.234 L -398.018 228.234 L +398.018 375 M +403.804 375 L +403.804 179.159 L +398.018 179.159 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -407.662 374 M -413.449 374 L -413.449 114.023 L -407.662 114.023 L +407.662 375 M +413.449 375 L +413.449 52.348 L +407.662 52.348 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -417.307 374 M -423.093 374 L -423.093 181.235 L -417.307 181.235 L +417.307 375 M +423.093 375 L +423.093 159.524 L +417.307 159.524 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -426.951 374 M -432.738 374 L -432.738 71.687 L -426.951 71.687 L +426.951 375 M +432.738 375 L +432.738 79.588 L +426.951 79.588 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -436.596 374 M -442.382 374 L -442.382 191.539 L -436.596 191.539 L +436.596 375 M +442.382 375 L +442.382 211.367 L +436.596 211.367 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -446.24 374 M -452.027 374 L -452.027 90.288 L -446.24 90.288 L +446.24 375 M +452.027 375 L +452.027 190.109 L +446.24 190.109 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -455.884 374 M -461.671 374 L -461.671 226.206 L -455.884 226.206 L +455.884 375 M +461.671 375 L +461.671 274.427 L +455.884 274.427 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -465.529 374 M -471.316 374 L -471.316 152.318 L -465.529 152.318 L +465.529 375 M +471.316 375 L +471.316 277.925 L +465.529 277.925 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -475.173 374 M -480.96 374 L -480.96 258.879 L -475.173 258.879 L +475.173 375 M +480.96 375 L +480.96 323.921 L +475.173 323.921 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT N -484.818 374 M -490.604 374 L -490.604 216.562 L -484.818 216.562 L +484.818 375 M +490.604 375 L +490.604 324.681 L +484.818 324.681 L cp f GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -79.751 374 M -79.751 302.389 L -85.538 302.389 L -85.538 374 L -79.751 374 L +79.751 375 M +79.751 348.895 L +85.538 348.895 L +85.538 375 L +79.751 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -89.396 374 M -89.396 262.82 L -95.182 262.82 L -95.182 374 L -89.396 374 L +89.396 375 M +89.396 342.831 L +95.182 342.831 L +95.182 375 L +89.396 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -99.04 374 M -99.04 210.492 L -104.827 210.492 L -104.827 374 L -99.04 374 L +99.04 375 M +99.04 336.342 L +104.827 336.342 L +104.827 375 L +99.04 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -108.684 374 M -108.684 268.338 L -114.471 268.338 L -114.471 374 L -108.684 374 L +108.684 375 M +108.684 351.018 L +114.471 351.018 L +114.471 375 L +108.684 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -118.329 374 M -118.329 232.797 L -124.116 232.797 L -124.116 374 L -118.329 374 L +118.329 375 M +118.329 339.036 L +124.116 339.036 L +124.116 375 L +118.329 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -127.973 374 M -127.973 257.263 L -133.76 257.263 L -133.76 374 L -127.973 374 L +127.973 375 M +127.973 338.974 L +133.76 338.974 L +133.76 375 L +127.973 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -137.618 374 M -137.618 216.686 L -143.404 216.686 L -143.404 374 L -137.618 374 L +137.618 375 M +137.618 323.504 L +143.404 323.504 L +143.404 375 L +137.618 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -147.262 374 M -147.262 260.387 L -153.049 260.387 L -153.049 374 L -147.262 374 L +147.262 375 M +147.262 343.952 L +153.049 343.952 L +153.049 375 L +147.262 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -156.907 374 M -156.907 204.732 L -162.693 204.732 L -162.693 374 L -156.907 374 L +156.907 375 M +156.907 333.247 L +162.693 333.247 L +162.693 375 L +156.907 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -166.551 374 M -166.551 241.331 L -172.338 241.331 L -172.338 374 L -166.551 374 L +166.551 375 M +166.551 345.562 L +172.338 345.562 L +172.338 375 L +166.551 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -176.196 374 M -176.196 171.463 L -181.982 171.463 L -181.982 374 L -176.196 374 L +176.196 375 M +176.196 334.21 L +181.982 334.21 L +181.982 375 L +176.196 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -185.84 374 M -185.84 221.833 L -191.627 221.833 L -191.627 374 L -185.84 374 L +185.84 375 M +185.84 349.335 L +191.627 349.335 L +191.627 375 L +185.84 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -195.484 374 M -195.484 145.701 L -201.271 145.701 L -201.271 374 L -195.484 374 L +195.484 375 M +195.484 342.891 L +201.271 342.891 L +201.271 375 L +195.484 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -205.129 374 M -205.129 201.14 L -210.916 201.14 L -210.916 374 L -205.129 374 L +205.129 375 M +205.129 354.37 L +210.916 354.37 L +210.916 375 L +205.129 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -214.773 374 M -214.773 129.423 L -220.56 129.423 L -220.56 374 L -214.773 374 L +214.773 375 M +214.773 347.02 L +220.56 347.02 L +220.56 375 L +214.773 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -224.418 374 M -224.418 188.688 L -230.204 188.688 L -230.204 374 L -224.418 374 L +224.418 375 M +224.418 357.972 L +230.204 357.972 L +230.204 375 L +224.418 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -234.062 374 M -234.062 145.35 L -239.849 145.35 L -239.849 374 L -234.062 374 L +234.062 375 M +234.062 348.885 L +239.849 348.885 L +239.849 375 L +234.062 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -243.707 374 M -243.707 215.786 L -249.493 215.786 L -249.493 374 L -243.707 374 L +243.707 375 M +243.707 356.327 L +249.493 356.327 L +249.493 375 L +243.707 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -253.351 374 M -253.351 171.034 L -259.138 171.034 L -259.138 374 L -253.351 374 L +253.351 375 M +253.351 345.762 L +259.138 345.762 L +259.138 375 L +253.351 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -262.996 374 M -262.996 245.361 L -268.782 245.361 L -268.782 374 L -262.996 374 L +262.996 375 M +262.996 356.867 L +268.782 356.867 L +268.782 375 L +262.996 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -272.64 374 M -272.64 213.899 L -278.427 213.899 L -278.427 374 L -272.64 374 L +272.64 375 M +272.64 339.529 L +278.427 339.529 L +278.427 375 L +272.64 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -282.284 374 M -282.284 280.661 L -288.071 280.661 L -288.071 374 L -282.284 374 L +282.284 375 M +282.284 344.13 L +288.071 344.13 L +288.071 375 L +282.284 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -291.929 374 M -291.929 249.474 L -297.716 249.474 L -297.716 374 L -291.929 374 L +291.929 375 M +291.929 326.26 L +297.716 326.26 L +297.716 375 L +291.929 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -301.573 374 M -301.573 288.382 L -307.36 288.382 L -307.36 374 L -301.573 374 L +301.573 375 M +301.573 339.906 L +307.36 339.906 L +307.36 375 L +301.573 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -311.218 374 M -311.218 277.695 L -317.004 277.695 L -317.004 374 L -311.218 374 L +311.218 375 M +311.218 308.181 L +317.004 308.181 L +317.004 375 L +311.218 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -320.862 374 M -320.862 294.076 L -326.649 294.076 L -326.649 374 L -320.862 374 L +320.862 375 M +320.862 315.884 L +326.649 315.884 L +326.649 375 L +320.862 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -330.507 374 M -330.507 263.943 L -336.293 263.943 L -336.293 374 L -330.507 374 L +330.507 375 M +330.507 271.453 L +336.293 271.453 L +336.293 375 L +330.507 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -340.151 374 M -340.151 303.034 L -345.938 303.034 L -345.938 374 L -340.151 374 L +340.151 375 M +340.151 296.266 L +345.938 296.266 L +345.938 375 L +340.151 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -349.796 374 M -349.796 234.126 L -355.582 234.126 L -355.582 374 L -349.796 374 L +349.796 375 M +349.796 223.404 L +355.582 223.404 L +355.582 375 L +349.796 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -359.44 374 M -359.44 279.865 L -365.227 279.865 L -365.227 374 L -359.44 374 L +359.44 375 M +359.44 281.048 L +365.227 281.048 L +365.227 375 L +359.44 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -369.084 374 M -369.084 223.377 L -374.871 223.377 L -374.871 374 L -369.084 374 L +369.084 375 M +369.084 161.078 L +374.871 161.078 L +374.871 375 L +369.084 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -378.729 374 M -378.729 255.298 L -384.516 255.298 L -384.516 374 L -378.729 374 L +378.729 375 M +378.729 225.155 L +384.516 225.155 L +384.516 375 L +378.729 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -388.373 374 M -388.373 167.594 L -394.16 167.594 L -394.16 374 L -388.373 374 L +388.373 375 M +388.373 98.742 L +394.16 98.742 L +394.16 375 L +388.373 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -398.018 374 M -398.018 228.234 L -403.804 228.234 L -403.804 374 L -398.018 374 L +398.018 375 M +398.018 179.159 L +403.804 179.159 L +403.804 375 L +398.018 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -407.662 374 M -407.662 114.023 L -413.449 114.023 L -413.449 374 L -407.662 374 L +407.662 375 M +407.662 52.348 L +413.449 52.348 L +413.449 375 L +407.662 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -417.307 374 M -417.307 181.235 L -423.093 181.235 L -423.093 374 L -417.307 374 L +417.307 375 M +417.307 159.524 L +423.093 159.524 L +423.093 375 L +417.307 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -426.951 374 M -426.951 71.687 L -432.738 71.687 L -432.738 374 L -426.951 374 L +426.951 375 M +426.951 79.588 L +432.738 79.588 L +432.738 375 L +426.951 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -436.596 374 M -436.596 191.539 L -442.382 191.539 L -442.382 374 L -436.596 374 L +436.596 375 M +436.596 211.367 L +442.382 211.367 L +442.382 375 L +436.596 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -446.24 374 M -446.24 90.288 L -452.027 90.288 L -452.027 374 L -446.24 374 L +446.24 375 M +446.24 190.109 L +452.027 190.109 L +452.027 375 L +446.24 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -455.884 374 M -455.884 226.206 L -461.671 226.206 L -461.671 374 L -455.884 374 L +455.884 375 M +455.884 274.427 L +461.671 274.427 L +461.671 375 L +455.884 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -465.529 374 M -465.529 152.318 L -471.316 152.318 L -471.316 374 L -465.529 374 L +465.529 375 M +465.529 277.925 L +471.316 277.925 L +471.316 375 L +465.529 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -475.173 374 M -475.173 258.879 L -480.96 258.879 L -480.96 374 L -475.173 374 L +475.173 375 M +475.173 323.921 L +480.96 323.921 L +480.96 375 L +475.173 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 2 setlinecap 10.0 ML N -484.818 374 M -484.818 216.562 L -490.604 216.562 L -490.604 374 L -484.818 374 L +484.818 375 M +484.818 324.681 L +490.604 324.681 L +490.604 375 L +484.818 375 L S GR GS -[0.75 0 0 0.75 0 0] CT +[0.75 0 0 0.75 0 0.25] CT 0.149 GC 2 setlinecap 10.0 ML N -73 374 M -507 374 L +73 375 M +507 375 L S GR %%Trailer diff --git a/rapport/main.tex b/rapport/main.tex index 9b07021..e28afd5 100644 --- a/rapport/main.tex +++ b/rapport/main.tex @@ -1,4 +1,6 @@ -\documentclass[a4paper,10pt]{article} +\documentclass[a4paper,10pt,twoside,titlepage]{article} + +\usepackage[top=2cm, bottom=3cm, inner=5cm,outer=3cm]{geometry} \usepackage[francais]{babel} \usepackage[utf8]{inputenc} @@ -6,6 +8,7 @@ \usepackage{lmodern} \usepackage{amssymb, amsmath, amsthm} +\usepackage[title,titletoc,toc]{appendix} \usepackage{framed} \usepackage{graphicx} @@ -17,23 +20,126 @@ \usepackage{color} \usepackage[usenames,dvipsnames]{xcolor} \usepackage{epstopdf} +\usepackage{fancyhdr} + +\definecolor{mygreen}{RGB}{28,172,0} % color values Red, Green, Blue +\definecolor{mylilas}{RGB}{170,55,241} +\lstset{language=Matlab,% + breaklines=true,% + morekeywords={matlab2tikz}, + keywordstyle=\color{blue},% + morekeywords=[2]{1}, keywordstyle=[2]{\color{black}}, + identifierstyle=\color{black},% + stringstyle=\color{mylilas}, + commentstyle=\color{mygreen},% + showstringspaces=false,%without this there will be a symbol in the places where there is a space + numbers=left,% + numberstyle={\tiny \color{black}},% size of the numbers + numbersep=9pt, % this defines how far the numbers are from the text + emph=[1]{for,end,break},emphstyle=[1]\color{red}, %some words to emphasis + %emph=[2]{word1,word2}, emphstyle=[2]{style}, +} + +% \title{Détection de cellules sanguines infectées par la malaria} +% \author{G.Burri} + +\pagestyle{fancy} +\fancyfoot[CE,CO]{} +\fancyfoot[LE,RO]{\thepage} -\title{Détection de cellules sanguines infectées par la malaria} -\author{G.Burri} \begin{document} \nocite{*} -\maketitle +% \maketitle + +\begin{titlepage} +\begin{center} +\huge +\vspace*{1cm} +\textbf{Détection de cellules sanguines infectées par la malaria} +\vspace{1cm} + +\Large +Master of Science HES-SO in Engineering + +\large +\vspace{2cm} +Juin 2015 - Révision N°1 + +\vspace{10cm} +\normalsize +Auteur : Grégory \textsc{Burri}\\ +Prof. responsable : Michel \textsc{Kocher} +\vspace{3cm} + +Master of Science HES-SO in Engineering\\ +Av. de Provence 6\\ +CH-1007 Lausanne\\ + +\end{center} +\end{titlepage} + +% Page vide (derrière le titre). +\newpage +\thispagestyle{empty} +\null + + +% Page contenant les signatures. +\newpage +\thispagestyle{empty} +\noindent +Accepté par la HES-SO//Master (Suisse, Lausanne) sur proposition de M. Kocher. + +\vspace{0.5cm} +\noindent +Prof. Michel Kocher, conseiller du projet d'approfondissement\\ +TODO : Expert + +\vspace{1cm} + +\noindent +Lausanne, le + +\vspace{1cm} + +\noindent +\setlength{\tabcolsep}{20pt} +\begin{tabular}{ l l } + Prof. Michel Kocher. & XXX\\ + Conseiller & Responsable de filière +\end{tabular} + +\newpage + +% Page contenant le résumé et les mots-clefs. + +\thispagestyle{empty} +\begin{center} +\textbf{Résumé} +\end{center} +bla bla bla + + +\vspace{5cm} + + +\begin{center} +\textbf{Mots-clefs} +\end{center} +"malaria", "paludisme" +\newpage -\section{Résumé} - -\section{Mots-clef} - + + +\tableofcontents +\newpage + \section{Introduction} @@ -68,7 +174,7 @@ Le processus est actuellement réalisé sur des images réduites de 40 \% à l'a \begin{figure}[htbp] \centering - \includegraphics[width=\linewidth]{img/imgRGB.png} + \includegraphics[width=0.8\linewidth]{img/imgRGB.png} \caption{Image originale en entrée ($imgRGB$)} \label{fig:imgRGB} \end{figure} @@ -90,14 +196,14 @@ Les histogrammes des deux images $imgH$ et $imgS$ sont montrés par les figures \begin{figure}[htbp] \centering - \includegraphics[width=\linewidth]{img/histogram_imgH.eps} + \includegraphics[width=0.8\linewidth]{img/histogram_imgH.eps} \caption{Histogramme de la teinte ($imgH$)} \label{fig:histogram_imgH} \end{figure} \begin{figure}[htbp] \centering - \includegraphics[width=\linewidth]{img/histogram_imgS.eps} + \includegraphics[width=0.8\linewidth]{img/histogram_imgS.eps} \caption{Histogramme de la saturation ($imgS$)} \label{fig:histogram_imgS} \end{figure} @@ -106,14 +212,14 @@ Afin de gommer le bruit et de rendre le fond plus homogène et plus sombre, un f \begin{figure}[htbp] \centering - \includegraphics[width=\linewidth]{img/imgHFiltered.jpg} + \includegraphics[width=0.8\linewidth]{img/imgHFiltered.jpg} \caption{Composante \emph{teinte} après filtrage ($imgFiltered\{1\}$)} \label{fig:imgHFiltered} \end{figure} \begin{figure}[htbp] \centering - \includegraphics[width=\linewidth]{img/imgSFiltered.jpg} + \includegraphics[width=0.8\linewidth]{img/imgSFiltered.jpg} \caption{Composante \emph{saturation} après filtrage ($imgFiltered\{2\}$)} \label{fig:imgSFiltered} \end{figure} @@ -121,22 +227,24 @@ Afin de gommer le bruit et de rendre le fond plus homogène et plus sombre, un f \subsubsection{Granulométrie} -L'objectif ici est de déterminer le rayon moyenne des globules rouges (souvent abrégé \emph{RBC} pour \emph{red blood cell}). Pour ce faire nous allons réaliser une succession de fermetures à l'aide d'un élément structurant de forme octogonale sur la composante \emph{saturation} ($imgFiltered\{2\}$). Nous évitons ici un élément structurant ayant la forme d'un disque pour des raisons de performance, une fermeture avec ce dernier demandant beaucoup plus de calculs à effectuer. +L'objectif ici est de déterminer le rayon moyenne des globules rouges (souvent abrégé \emph{RBC} pour \emph{red blood cell}). Pour ce faire nous allons réaliser une succession de fermetures à l'aide d'un élément structurant de forme octogonale sur la composante \emph{saturation} ($imgFiltered\{2\}$). Nous évitons ici un élément structurant ayant la forme d'un disque pour des raisons de performance, une fermeture avec ce dernier demandant beaucoup plus de calculs à effectuer. Une ouverture par aire de 1000 est appliquée au préalable sur la composante \emph{saturation} afin de niveler les cellules. -Nous partons d'un rayon initial de un pour arriver à un rayon maximal de $largeur(imgRGB) / 35$. La rayon maximal est définit en fonction de la largeur de l'image ce qui permet de ne pas être dépendant de sa résolution. À chaque itération une fermeture est effectuée suivi du calcul du volume relatif de l'image : $volume(imgClosed) \rightarrow A, 1 - A / volImg \rightarrow N$ où $volImg$ est le volume de $imgFiltered\{2\}$. La différence de volume est calculé pour chaque itération $i$ comme suit : $N_{i + 1} - N_i$. +\begin{sloppypar} +Nous partons d'un rayon initial de un pour arriver à un rayon maximal de $width(imgRGB) / 35$. La rayon maximal est définit en fonction de la largeur de l'image ce qui permet de ne pas être dépendant de sa résolution. À chaque itération une fermeture est effectuée suivi du calcul du volume relatif de l'image : $volume(imgClosed) \rightarrow A, 1 - A / volImg \rightarrow N$ où $volImg$ est le volume de $imgFiltered\{2\}$. La différence de volume est calculé pour chaque itération $i$ comme suit : $N_{i + 1} - N_i$. +\end{sloppypar} -Nous définissions le rayon moyen des globules rouges ($RBCRadius$) comme étant le rayon de l'élément structurant correspondant à la valeur maximale parmi les différences de volume. Le rayon moyen du noyau des parasites est impossible à extraire des différences de volume, nous le calculons comme étant un sixième de la taille des globules rouges : $RBCRadius / 6 \rightarrow nucleiRadius$. La figure \ref{fig:patternSpectrum} montre le graphique de la distribution des différences. Dans ce cas $RBCRadius$ est égal à 37 et $nucleiRadius$ à 7.4. +Nous définissions le rayon moyen des globules rouges ($RBCRadius$) comme étant le rayon de l'élément structurant correspondant à la valeur maximale parmi les différences de volume. Le rayon moyen du noyau des parasites est impossible à extraire des différences de volume, nous le calculons comme étant un cinquième de la taille des globules rouges : $RBCRadius / 5 \rightarrow nucleiRadius$. La figure \ref{fig:patternSpectrum} montre le graphique de la distribution des différences. Dans ce cas $RBCRadius$ est égal à 37 et $nucleiRadius$ à 7.4. \begin{figure}[htbp] \centering - \includegraphics[width=\linewidth]{img/pattern_spectrum_granulometry.eps} - \caption{Distribution des différences calculé lors de la granulométrie} + \includegraphics[width=0.8\linewidth]{img/pattern_spectrum_granulometry.eps} + \caption{Distribution des différences calculée lors de la granulométrie} \label{fig:patternSpectrum} \end{figure} \subsubsection{Extrêmes régionaux} -Pour la recherche des extrêmes régionaux nous utilisons la fonction \texttt{mmregmax}. La figure \ref{fig:regmax_sample} montre un exemple d'application de cette fonction. +Pour la recherche des extrêmes régionaux nous utilisons la fonction \texttt{mmregmax}. La figure \ref{fig:regmax_sample} montre un exemple d'application de cette fonction à l'aide d'un élément structurant carré de taille 5. \begin{figure}[htbp] \centering @@ -154,14 +262,13 @@ Pour la recherche des extrêmes régionaux nous utilisons la fonction \texttt{mm ~ \begin{subfigure}[b]{0.38\textwidth} \includegraphics[width=\linewidth]{img/regmax_sample_result.eps} - \caption{Le résultat} + \caption{Le résultat de l'application de \texttt{mmregmax}} \label{fig:regmax_sample_result} \end{subfigure} \caption{Example d'application de la fonction \texttt{mmregmax}} \label{fig:regmax_sample} \end{figure} - Afin d'identifier les éléments colorés, une recherche des maximaux régionaux est réalisée sur les deux composantes \emph{teinte} et \emph{saturation} à l'aide d'un élément structurant octogonal de rayon $RBCRadius$. Les deux résultats sont ensuite dilatés de $nucleiRadius$ puis combinés avec une intersection. {\setlength{\abovedisplayskip}{0pt} @@ -186,10 +293,9 @@ La teinte et la saturation sont seuillés à l'aide ${\mu}H$, respectivement ${\ THS &= TH \cap TS & \end{flalign} - \begin{figure}[htbp] \centering - \includegraphics[width=\linewidth]{img/THS.jpg} + \includegraphics[width=0.8\linewidth]{img/THS.jpg} \caption{Les éléments colorés mis en évidence ($THS$)} \label{fig:THS} \end{figure} @@ -197,15 +303,16 @@ La teinte et la saturation sont seuillés à l'aide ${\mu}H$, respectivement ${\ \subsection{Détection des globules blancs} -Cette opération utilise l'image de marquage des parasites ains que la taille des globules rouges. Les globules blancs sont tout d'abord marqués à l'aide d'une érosion utilisant un élément structurant octogonal dont la taille correspond à 80 \% de celle des globules blancs. - -TODO : (à développer) +Cette opération utilise l'image de marquage des éléments colorés ($THS$) ainsi que la taille des globules rouges ($RBCRadius$). Les globules blancs sont tout d'abord marqués à l'aide d'une érosion utilisant un élément structurant octogonal dont la taille correspond à 50 \% de celle des globules rouges ($0.5 * RBCRadius$). Puis reconstruction par dilatation des éléments colorés en utilisant le marqueur précédent permet de ne garder que les globules blanc. -\begin{itemize} - \item Reconstruction - \item Bouchage des trous -\end{itemize} +Finalement l'on lisse le résultat en réalisant une fermeture suivit d'une ouverture afin de fermer les petits trous qu'il pourrait rester. Le résultat est appelé $WBC$ et est montré par la figure \ref{fig:WBC}. +\begin{figure}[htbp] + \centering + \includegraphics[width=0.8\linewidth]{img/WBC.jpg} + \caption{Le gradient des globules blancs imprimé sur l'image originale ($WBC$)} + \label{fig:WBC} +\end{figure} \subsection{Détection des schizontes} @@ -229,7 +336,6 @@ Cette modification permet d'éviter de détecter certains parasites comme étant \subsection{Ségmentation des globules rouges} - \subsubsection{Calcul des Distances et Watersheds} Après le seuillage des globules rouge certaines régions comprenent deux ou plusieurs globules rouges qu'il faut séparer. L'article propose une calssification en fonction du rapport grand axe/petit axe de ces zones, les zones dont le rapport est supperieur à 1.3 sont traitées comme des amas de cellules. @@ -237,12 +343,20 @@ Après le seuillage des globules rouge certaines régions comprenent deux ou plu Dans un premier temps nous utilisons une approche plus simple, sans nécessité de classification des amas, basée sur une transformée de distance puis l'application de l'algorithme \emph{watersheds}. Ce processus est détaillé ci-après. \begin{framed} -$i$ : l'image seuilé +$i$ : l'image seuillée \begin{enumerate} \item d <- \end{enumerate} \end{framed} + +\begin{figure}[htbp] + \centering + \includegraphics[width=\linewidth]{img/splitting_composites.jpg} + \caption{Application } + \label{fig:pouet} +\end{figure} + \subsection{Identification des globules rouges infectés} @@ -349,8 +463,20 @@ Cette erreur importante est liée à beaucoup de parasite manqué lors de la rec Travaux futurs? -\bibliographystyle{plain} -\bibliography{main} +%\bibliographystyle{plain} +%\bibliography{main} + + +\begin{appendices} +\section{Code MATLAB} \label{app:matlab} + +\subsection{} + +\lstinputlisting{../src/Main.m} + +\end{appendices} + + \end{document} diff --git "a/rapport/r\303\251sultats.ods" "b/rapport/r\303\251sultats.ods" index fb18d6b..14726ea 100644 Binary files "a/rapport/r\303\251sultats.ods" and "b/rapport/r\303\251sultats.ods" differ diff --git a/src/DetectionOfParasites.m b/src/DetectionOfParasites.m index 3254fdb..2fe1773 100644 --- a/src/DetectionOfParasites.m +++ b/src/DetectionOfParasites.m @@ -38,7 +38,8 @@ function [THS, RBCRadius, nucleiRadius] = DetectionOfParasites(imgRGB) %% Granulometry % We use the saturation component to find the red cells mean size. - saturationComponent = imgFiltered{2}; + % We apply an area opening to fill the bright zones inside each cells. + saturationComponent = mmareaopen(imgFiltered{2}, 1000, mmsebox(1)); redCellMaxSize = uint32(size(imgRGB, 2) / 35); % Radius [px], depending of the input size. funVolume = @(m) sum(sum(m)); @@ -62,7 +63,7 @@ function [THS, RBCRadius, nucleiRadius] = DetectionOfParasites(imgRGB) % The paper chooses the biggest red cell size among the possible red cell sizes. (FIXME) [~, RBCRadius] = max(patternSpectrum); - nucleiRadius = RBCRadius / 6; % We admit the size of a parasite is six time smaller than a red blood cell. Find a way to extract this information from the pattern spectrum histogram. (FIXME) + nucleiRadius = RBCRadius / 5; % We admit the size of a parasite is five time smaller than a red blood cell. Find a way to extract this information from the pattern spectrum histogram. (FIXME) bar(patternSpectrum, 0.6, 'EdgeColor', 'black', 'FaceColor', 'black'); diff --git a/src/DetectionOfWhiteCells.m b/src/DetectionOfWhiteCells.m index 7782fdc..923baf8 100644 --- a/src/DetectionOfWhiteCells.m +++ b/src/DetectionOfWhiteCells.m @@ -1,15 +1,18 @@ % Inputs: % RBCRadius: The typical red cell radius [px]. function [WBCSmoothed] = DetectionOfWhiteCells(THS, RBCRadius) - % We use a radius near the smallest red blood cell size (80% of the radius) - redCellsSE = mmsedisk(RBCRadius * 0.5, '2D', 'OCTAGON'); + % We use a radius near the smallest red blood cell size (50% of the radius) + redCellsSE = mmsedisk(0.5 * RBCRadius, '2D', 'OCTAGON'); % The white cells may not be correctly marked in the case they have a very special shape (oblong). WBCMarker = mmero(THS, redCellsSE); % Erosion to keep only fragments of white cells. WBC = mminfrec(WBCMarker, THS); % Reconstruction by dilation. % Morphological smoothing (Hole filling). - WBCSmoothed = mmclohole(WBC); +% WBCSmoothed = mmclohole(WBC); + + smoothingSE = mmsedisk(0.1 * RBCRadius, '2D', 'OCTAGON'); + WBCSmoothed = mmopen(mmclose(WBC, smoothingSE), smoothingSE); WriteImageGradient(WBCSmoothed, '../output/whiteCells.png', [150, 255, 150]); end \ No newline at end of file diff --git a/src/Main.m b/src/Main.m index ba832df..39c3514 100644 --- a/src/Main.m +++ b/src/Main.m @@ -25,15 +25,33 @@ delete('../output/*'); % imagePath = '1412151257/1412151257-Gamma-1-0007.png'; %% 13 mai 2015 +% prefix = '13.05.2015/1412151257-100x-'; +% imagePath = [prefix 'Teinte30-Saturation3-0013.tif']; -% imagePath = '13.05.2015/1412151257-100x-Teinte30-Saturation3-0013.tif'; -% imagePath = '13.05.2015/1412151257-100x-Teinte30-Saturation3-0014.tif'; % Good result. -% imagePath = '13.05.2015/1412151257-100x-Teinte0-Saturation0-0015.tif'; % Bad result. +% Good result. +% imagePath = [prefix 'Teinte30-Saturation3-0014.tif']; + +% Bad result. +% imagePath = [prefix ... +% '13.05.2015/1412151257-100x-Teinte0-Saturation0-0015.tif'; % imagePath = '13.05.2015/1412151257-100x-0010.tif'; %% 22 mai 2015 -imagePath = '22.05.2015/1412151257-100x-avecfiltre-lum8-676ms-Teinte0-Saturation0- SatMachine150-0045.png'; +prefix = '22.05.2015/1412151257-100x-avecfiltre-lum8-'; +imagePath = [prefix ... + '676ms-Teinte0-Saturation0- SatMachine150-0036.png']; +% imagePath = [prefix ... +% '676ms-Teinte0-Saturation0- SatMachine150-0037.png']; % Blurred. +% imagePath = [prefix ... +% 676ms-Teinte0-Saturation0- SatMachine150-0038.png']; +% imagePath = '22.05.2015/1412151257-100x-avecfiltre-lum8-676ms-Teinte0-Saturation0- SatMachine150-0039.png'; +% imagePath = '22.05.2015/1412151257-100x-avecfiltre-lum8-676ms-Teinte0-Saturation0- SatMachine150-0040.png'; +% imagePath = '22.05.2015/1412151257-100x-avecfiltre-lum8-676ms-Teinte0-Saturation0- SatMachine150-0041.png'; +% imagePath = '22.05.2015/1412151257-100x-avecfiltre-lum8-676ms-Teinte0-Saturation0- SatMachine150-0042.png'; +% imagePath = '22.05.2015/1412151257-100x-avecfiltre-lum8-676ms-Teinte0-Saturation0- SatMachine150-0043.png'; +% imagePath = '22.05.2015/1412151257-100x-avecfiltre-lum8-676ms-Teinte0-Saturation0- SatMachine150-0044.png'; +% imagePath = '22.05.2015/1412151257-100x-avecfiltre-lum8-676ms-Teinte0-Saturation0- SatMachine150-0045.png'; % imagePath = '22.05.2015/1412151257-100x-avecfiltre-lum8-676ms-Teinte0-Saturation0- SatMachine150-0046.png'; % imagePath = '22.05.2015/1410100927-100x-avecfiltre-lum8-267ms-Teinte0-Saturation0- SatMachine150-0047.png'; @@ -47,13 +65,11 @@ imagePath = '22.05.2015/1412151257-100x-avecfiltre-lum8-676ms-Teinte0-Saturation % imagePath = '22.05.2015/1410051390-100x-avecfiltre-lum8-172ms-Teinte0-Saturation0- SatMachine150-0055.png'; % imagePath = '22.05.2015/1410051390-100x-avecfiltre-lum8-172ms-Teinte0-Saturation0- SatMachine150-0056.png'; -segmentationMethod = SegmentationMethod.WatershedByMorphologicalGradient; +scaleFactor = 0.6; %% Main fprintf('Image path: %s\n', imagePath); -scaleFactor = 0.6; - % Load the image and its ground truth. imgRGB = loadImg(imagePath); @@ -81,6 +97,9 @@ disp('5) Finding infected red cells ...') [infectedRedCells] = IdentificationOfInfectedRedCells(redCells, THSWithoutWBCandSchizonts); disp('6) Counting red cells and infected red cells ...') + +imwrite(mmlabel(redCells), '../output/red cells segmentation - individual labeled.png'); + nbRedCells = mmstats(mmlabel(redCells), 'max'); nbInfectedRedCells = mmstats(mmlabel(infectedRedCells), 'max'); infectionPercentage = 100 * nbInfectedRedCells / nbRedCells; diff --git a/src/SegmentationOfRedCells.m b/src/SegmentationOfRedCells.m index a0af111..cfe4b60 100644 --- a/src/SegmentationOfRedCells.m +++ b/src/SegmentationOfRedCells.m @@ -26,22 +26,14 @@ function [segmentedCells] = SegmentationOfRedCells(imgRGB, RBCRadius, WBC, schiz %% Segmentation % To smooth the borders and to remove little elements. - opened = mmopen(redCellsFiltered, mmsedisk(RBCRadiusMin, '2D', 'EUCLIDEAN', 'NON-FLAT')); + % Here the paper use a non-flat ('NON-FLAT') but it's useless in our case. + opened = mmopen(redCellsFiltered, mmsedisk(RBCRadiusMin, '2D', 'EUCLIDEAN', 'FLAT')); imwrite(opened, '../output/red cells segmentation - opened.png') openedThreshold = im2bw(opened, 0.02); imwrite(openedThreshold, '../output/red cells segmentation - opened - threshold.png') - - switch segmentationMethod - case SegmentationMethod.WatershedByDistanceTransform - %% Simplified version. - - % Remove cells which are touching the edges. - segmentedCells = mmedgeoff(WatershedsByDistanceTransform(openedThreshold)); - - case SegmentationMethod.WatershedByMorphologicalGradient - - %% Don't know the meaning. (end of the right column of page 139). + + %% Don't know the meaning. (end of the right column of page 139). % openedGradient = mmgradm(opened); % imwrite(openedGradient, '../output/red cells segmentation - opened - gradient.png') @@ -50,57 +42,58 @@ function [segmentedCells] = SegmentationOfRedCells(imgRGB, RBCRadius, WBC, schiz % holesClosed = mmareaclose(openedGradientThreshold, 10 * cMinArea); % imwrite(holesClosed, '../output/red cells segmentation - holes closed.png') - - % Watershed by distance transform. - watershed = mmedgeoff(WatershedsByDistanceTransform(openedThreshold)); - imwrite(watershed, '../output/red cells segmentation - watershed.png') - - watershedLabeled = mmlabel(watershed); - axisProperties = regionprops(watershedLabeled, 'MajorAxisLength', 'MinorAxisLength'); - - % The area opening remove the little artifacts. - watershedSingles = mmareaopen(watershed, RBCRadiusMinArea / 5); - - for k = 1:length(axisProperties) - % We remove each composite cell from 'watershedSingle'. - if axisProperties(k).MajorAxisLength / axisProperties(k).MinorAxisLength >= 1.3 - watershedSingles(watershedLabeled == k) = 0; - end - end - imwrite(watershedSingles, '../output/red cells segmentation - watershed singles.png') - - % We remove the single cells from the initial image to obtain the composite cells. - composites = mmedgeoff(and(openedThreshold, ~watershedSingles)); - imwrite(composites, '../output/red cells segmentation - composites.png') - - compositesOpened = grayFlat; - compositesOpened(~composites) = 0; - compositesOpened = mmopen(compositesOpened, mmsedisk(RBCRadiusMin, '2D', 'EUCLIDEAN', 'FLAT')); - - imwrite(compositesOpened, '../output/red cells segmentation - composites opened.png') - - compositesOpenedGradient = mmgradm(compositesOpened); - imwrite(compositesOpenedGradient, '../output/red cells segmentaion - composites opened gradient.png'); - - compositesOpenedGradientThreshold = im2bw(compositesOpenedGradient, 0.00001); - imwrite(compositesOpenedGradientThreshold, '../output/red cells segmentation - composites opened gradient threshold.png') - - compositesOpenedGradientThresholdHolesFilled = ~mmareaopen(~compositesOpenedGradientThreshold, RBCRadiusMinArea / 2); - imwrite(compositesOpenedGradientThresholdHolesFilled, '../output/red cells segmentation - composites opened gradient threshold holes filled.png') - - compositesThinning = mmthin(compositesOpenedGradientThresholdHolesFilled); - - imwrite(compositesThinning, '../output/red cells segmentation - composites thinning 1.png') - - compositesThinningFlooded = mmareaclose(compositesThinning, 5 * RBCRadiusMinArea); - compositesThinningFlooded(compositesThinning) = 0; - compositesThinningFlooded = mmero(compositesThinningFlooded); % We erode by a 3x3 cross to avoid the composites to touch the singles when fusionning later. - imwrite(compositesThinningFlooded, '../output/red cells segmentation - composites thinning.png') - - % Compute the ratio of the major axis over the minor axis and keep - % cells with a ration greater than or equal to 1.3. - segmentedCells = or(compositesThinningFlooded, watershedSingles); - end + + % Watershed by distance transform. + watershed = WatershedsByDistanceTransform(openedThreshold); + imwrite(watershed, '../output/red cells segmentation - watershed.png') + + watershedLabeled = mmlabel(watershed); + axisProperties = regionprops(watershedLabeled, 'MajorAxisLength', 'MinorAxisLength'); + + % The area opening remove the little artifacts. + watershedSingles = mmareaopen(watershed, RBCRadiusMinArea / 5); + + % Compute the ratio of the major axis over the minor axis and keep + % cells with a ration greater than or equal to 1.3 as single. + % The others will be processed as composite cells. + for k = 1:length(axisProperties) + % We remove each composite cell from 'watershedSingle'. + if axisProperties(k).MajorAxisLength / axisProperties(k).MinorAxisLength >= 1.3 + watershedSingles(watershedLabeled == k) = 0; + end + end + imwrite(watershedSingles, '../output/red cells segmentation - watershed singles.png') + + % We remove the single cells from the initial image to obtain the composite cells. + composites = and(openedThreshold, ~watershedSingles); + imwrite(composites, '../output/red cells segmentation - composites.png') + + compositesOpened = grayFlat; + compositesOpened(~composites) = 0; + compositesOpened = mmopen(compositesOpened, mmsedisk(RBCRadiusMin, '2D', 'EUCLIDEAN', 'FLAT')); + + imwrite(compositesOpened, '../output/red cells segmentation - composites opened.png') + + compositesOpenedGradient = mmgradm(compositesOpened); + imwrite(compositesOpenedGradient, '../output/red cells segmentaion - composites opened gradient.png'); + + compositesOpenedGradientThreshold = im2bw(compositesOpenedGradient, 0.00001); + imwrite(compositesOpenedGradientThreshold, '../output/red cells segmentation - composites opened gradient threshold.png') + + compositesOpenedGradientThresholdHolesFilled = ~mmareaopen(~compositesOpenedGradientThreshold, RBCRadiusMinArea / 2); + imwrite(compositesOpenedGradientThresholdHolesFilled, '../output/red cells segmentation - composites opened gradient threshold holes filled.png') + + compositesThinning = mmthin(compositesOpenedGradientThresholdHolesFilled); + + imwrite(compositesThinning, '../output/red cells segmentation - composites thinning.png') + + compositesThinningFlooded = mmareaclose(compositesThinning, 5 * RBCRadiusMinArea); % We flood the areas. + compositesThinningFlooded(compositesThinning) = 0; % The areas are splitted. + compositesThinningFlooded = mmero(compositesThinningFlooded); % We erode by a 3x3 cross to avoid the composites to touch the singles when fusionning later. + compositesThinningFlooded = mmareaopen(compositesThinningFlooded, RBCRadiusMinArea / 5); % We remove little artefacts. + imwrite(compositesThinningFlooded, '../output/red cells segmentation - composites thinning flooded.png') + + segmentedCells = mmedgeoff(or(compositesThinningFlooded, watershedSingles)); WriteImageGradient(segmentedCells, '../output/red cells segmentation - individual.png', [255, 255, 255]); end \ No newline at end of file