X-Git-Url: http://git.euphorik.ch/?p=master-thesis.git;a=blobdiff_plain;f=Parasitemia%2FParasitemiaCore%2FImgTools.fs;h=3fb8ecfc114ff74eddac4791852e2a5df2205226;hp=44a6c86c73df18cb64004eeee9f4cbd975f4ab6c;hb=c4a76a01f62568c6353396ff85551a3151fc5236;hpb=94fbffc758bf0299b077e344ebcbecca408ae564 diff --git a/Parasitemia/ParasitemiaCore/ImgTools.fs b/Parasitemia/ParasitemiaCore/ImgTools.fs index 44a6c86..3fb8ecf 100644 --- a/Parasitemia/ParasitemiaCore/ImgTools.fs +++ b/Parasitemia/ParasitemiaCore/ImgTools.fs @@ -168,31 +168,19 @@ let suppressMAdjacency (img: Matrix) = /// The thresholds are automatically defined with otsu on gradient magnitudes. /// /// -let findEdges (img: Image) : Matrix * Image * Image = +let findEdges (img: Image) : Matrix * Matrix * Matrix = let w = img.Width let h = img.Height use sobelKernel = - new ConvolutionKernelF(array2D [[ 1.0f; 0.0f; -1.0f ] - [ 2.0f; 0.0f; -2.0f ] - [ 1.0f; 0.0f; -1.0f ]], Point(1, 1)) + new Matrix(array2D [[ 1.0f; 0.0f; -1.0f ] + [ 2.0f; 0.0f; -2.0f ] + [ 1.0f; 0.0f; -1.0f ]]) - let xGradient = img.Convolution(sobelKernel) - let yGradient = img.Convolution(sobelKernel.Transpose()) - - let xGradientData = xGradient.Data - let yGradientData = yGradient.Data - for r in 0 .. h - 1 do - xGradientData.[r, 0, 0] <- 0.f - xGradientData.[r, w - 1, 0] <- 0.f - yGradientData.[r, 0, 0] <- 0.f - yGradientData.[r, w - 1, 0] <- 0.f - - for c in 0 .. w - 1 do - xGradientData.[0, c, 0] <- 0.f - xGradientData.[h - 1, c, 0] <- 0.f - yGradientData.[0, c, 0] <- 0.f - yGradientData.[h - 1, c, 0] <- 0.f + let xGradient = new Matrix(img.Size) + let yGradient = new Matrix(img.Size) + CvInvoke.Filter2D(img, xGradient, sobelKernel, Point(1, 1)) + CvInvoke.Filter2D(img, yGradient, sobelKernel.Transpose(), Point(1, 1)) use magnitudes = new Matrix(xGradient.Size) use angles = new Matrix(xGradient.Size) @@ -223,8 +211,8 @@ let findEdges (img: Image) : Matrix * Image for i in 1 .. h - 2 do for j in 1 .. w - 2 do - let vx = xGradientData.[i, j, 0] - let vy = yGradientData.[i, j, 0] + let vx = xGradientData.[i, j] + let vy = yGradientData.[i, j] if vx <> 0.f || vy <> 0.f then let angle = anglesData.[i, j] @@ -942,7 +930,7 @@ let drawLineF (img: Image<'TColor, 'TDepth>) (color: 'TColor) (x0: float) (y0: f let drawEllipse (img: Image<'TColor, 'TDepth>) (e: Ellipse) (color: 'TColor) (alpha: float) = if alpha >= 1.0 then - img.Draw(Emgu.CV.Structure.Ellipse(PointF(float32 e.Cx, float32 e.Cy), SizeF(2.f * e.B, 2.f * e.A), e.Alpha / PI * 180.f), color, 1, CvEnum.LineType.AntiAlias) + img.Draw(Emgu.CV.Structure.Ellipse(PointF(e.Cx, e.Cy), SizeF(2.f * e.B, 2.f * e.A), e.Alpha / PI * 180.f), color, 1, CvEnum.LineType.AntiAlias) else let windowPosX = e.Cx - e.A - 5.f let gapX = windowPosX - (float32 (int windowPosX)) @@ -956,7 +944,7 @@ let drawEllipse (img: Image<'TColor, 'TDepth>) (e: Ellipse) (color: 'TColor) (al if roi = img.ROI // We do not display ellipses touching the edges (FIXME) then use i = new Image<'TColor, 'TDepth>(img.ROI.Size) - i.Draw(Emgu.CV.Structure.Ellipse(PointF(float32 <| (e.A + 5.f + gapX) , float32 <| (e.A + 5.f + gapY)), SizeF(2.f * e.B, 2.f * e.A), e.Alpha / PI * 180.f), color, 1, CvEnum.LineType.AntiAlias) + i.Draw(Emgu.CV.Structure.Ellipse(PointF(e.A + 5.f + gapX, e.A + 5.f + gapY), SizeF(2.f * e.B, 2.f * e.A), e.Alpha / PI * 180.f), color, 1, CvEnum.LineType.AntiAlias) CvInvoke.AddWeighted(img, 1.0, i, alpha, 0.0, img) img.ROI <- Rectangle.Empty