open System
open System.Linq
-open System.Drawing
open FSharp.Collections.ParallelSeq
open Config
open Types
+let warningRatioDifferenceRBCDiameter = 1.2
+
/// <summary>
/// Analyze the given image and detect reb blood cell (RBC) in it.
/// </summary>
/// The first call returning 'false' will cancel the analysis.
/// The 'int' parameter correspond to the progression from 0 to 100</param>
/// <returns>A list of detected cells or nothing if the process has been cancelled</returns>
-let doAnalysis (img : Image<Bgr, byte>) (name : string) (config : Config) (reportProgress : (int -> bool) option) : Cell list option =
+let doAnalysis (img : Image<Bgr, byte>) (name : string) (config : Config) (reportProgress : (int -> bool) option) : AnalysisResult option =
// To report the progress of this function from 0 to 100.
// Return 'None' if the process must be aborted.
let! cells = logTimeWithName "Classifier" (fun () -> reportWithVal 100 (Classifier.findCells prunedEllipses parasites img.Width img.Height config))
+ do
+ if config.RBCRadiusByResolution.μm / config.RBCRadius.μm > warningRatioDifferenceRBCDiameter then
+ logWithName (sprintf "Warning: erythrocyte diameter found is too low compared to the nominal erythrocyte diameter, maybe the PPI image resolution is lesser than %.0f ppi" config.Parameters.resolution)
+ elif config.RBCRadius.μm / config.RBCRadiusByResolution.μm > warningRatioDifferenceRBCDiameter then
+ logWithName (sprintf "Warning: erythrocyte diameter found is too high compared to the nominal erythrocyte diameter, maybe the PPI image resolution is higher than %.0f" config.Parameters.resolution)
+
logWithName "Analysis finished"
do
IO.saveImg img_float.[0] (buildFileName " - source - blue.png")
| _ -> ()
- return cells
+ return
+ {
+ Cells = cells
+ RBCSize_μm = config.RBCRadius.μm
+ RBCSize_px = config.RBCRadius.Pixel
+ }
+
+ //return cells
}
/// <summary>
-/// Do multiple analyses on the same time. The number of concurrent process depends if the number of the core.
+/// Do multiple analyses on the same time. The number of concurrent process depends on the number of the core.
/// </summary>
/// <param name="imgs">The images: (name * configuration * image)</param>
/// <param name="reportProgress">An optional function to report progress and/or cancel the process.
/// The first call returning 'false' will cancel the analysis.
/// The 'int' parameter correspond to the progression from 0 to 100</param>
-/// <returns>'None' if the process has been cancelled or the list of result as (name * cells), 'name' corresponds to the given name<returns>
-let doMultipleAnalysis (imgs : (string * Config * Image<Bgr, byte>) list) (reportProgress : (int -> bool) option) : (string * Cell list) list option =
+/// <return>'None' if the process has been cancelled or the list of result as (name * cells), 'name' corresponds to the given name</return>
+let doMultipleAnalysis (imgs : (string * Config * Image<Bgr, byte>) list) (reportProgress : (int -> bool) option) : (string * AnalysisResult) list option =
let report (percent : int) : bool =
match reportProgress with
| Some f -> f percent