Fix an out-of-bound array access.
authorGreg Burri <greg.burri@gmail.com>
Mon, 14 Dec 2015 21:06:31 +0000 (22:06 +0100)
committerGreg Burri <greg.burri@gmail.com>
Mon, 14 Dec 2015 21:06:31 +0000 (22:06 +0100)
Parasitemia/Parasitemia/Classifier.fs
Parasitemia/Parasitemia/KMedians.fs
Parasitemia/Parasitemia/MainAnalysis.fs
Parasitemia/Parasitemia/Program.fs

index e0bbfa9..8467d24 100644 (file)
@@ -65,8 +65,8 @@ let findCells (ellipses: Ellipse list) (parasites: ParasitesMarker.Result) (fg:
 
             let mutable totalElement = 0
             let mutable fgElement = 0
-            for y in minY .. maxY do
-                for x in minX .. maxX do
+            for y in (if minY < 0 then 0 else minY) .. (if maxY >= fg.Height then fg.Height - 1 else maxY) do
+                for x in (if minX < 0 then 0 else minX) .. (if maxX >= fg.Width then fg.Width - 1 else maxX) do
                     let yf, xf = float y, float x
                     if e.Contains xf yf && neighbors |> List.forall (fun (otherE, _, _) -> not <| otherE.Contains xf yf)
                         then
@@ -86,8 +86,8 @@ let findCells (ellipses: Ellipse list) (parasites: ParasitesMarker.Result) (fg:
                 let minX, minY, maxX, maxY = ellipseWindow e
 
                 let mutable area = 0
-                for y in minY .. maxY do
-                    for x in minX .. maxX do
+                for y in (if minY < 0 then 0 else minY) .. (if maxY >= fg.Height then fg.Height - 1 else maxY) do
+                    for x in (if minX < 0 then 0 else minX) .. (if maxX >= fg.Width then fg.Width - 1 else maxX) do
                         let yf, xf = float y, float x
                         if fg.Data.[y, x, 0] > 0uy &&
                            e.Contains xf yf &&
index 82e09cb..1822c75 100644 (file)
@@ -25,11 +25,11 @@ let kmedians (img: Image<Gray, float32>) (fgFactor: float) : Result =
 
     let mutable median_bg = (!max).[0] - ((!max).[0] - (!min).[0]) / 4.0
     let mutable median_fg = (!min).[0] + ((!max).[0] - (!min).[0]) / 4.0
-    let mutable d_bg = new Image<Gray, float32>(img.Size)
+    use mutable d_bg = new Image<Gray, float32>(img.Size)
     let mutable d_fg = new Image<Gray, float32>(img.Size)
     let mutable fg = new Image<Gray, byte>(img.Size)
 
-    for i in 1..nbIteration do
+    for i in 1 .. nbIteration do
         CvInvoke.Pow(img - median_bg, 2.0, d_bg)
         CvInvoke.Pow(img - median_fg, 2.0, d_fg)
         fg <- (d_fg * fgFactor).Cmp(d_bg, CvEnum.CmpType.LessThan)
index 9308780..3f35fb7 100644 (file)
@@ -59,7 +59,7 @@ let doAnalysis (img: Image<Bgr, byte>) (name: string) (config: Config) : Cell li
     logTime "Finding edges" (fun() -> thin edges)
     logTime "Removing small connected components from thinning" (fun () -> removeArea edges 12)
 
-    let kmediansResults = KMedians.kmedians filteredGreen 1.0
+    let kmediansResults = logTime "Finding foreground (k-medians)" (fun () -> KMedians.kmedians filteredGreen 1.0)
 
     let parasites = ParasitesMarker.find green filteredGreen kmediansResults config
 
index f23cd39..d7348cf 100644 (file)
@@ -115,7 +115,7 @@ let main args =
                     let total, infected = Utils.countCells cells
                     fprintf resultFile "File: %s %d %d %.2f\n" file total infected (100. * (float infected) / (float total))
                 with
-                | _ as ex -> Utils.log (sprintf "Unable to open the image '%A': %A" file ex)
+                | :? IOException as ex -> Utils.log (sprintf "Unable to open the image '%A': %A" file ex)
             0
 
         | Window ->