2016-08-19 27 views
0

EmguCVを使用して画像からブロブを抽出する際に問題が発生しています。私がオンラインで見るものはすべてContoursオブジェクトを使用しますが、EmguCV3.0から削除されたと思いますか?私はそれを使用しようとするたびに例外が発生します。私は最新ではない多くの最近の/関連するSOのトピックを発見していない。画像内で最大のブロブを見つける

基本的に、私は葉の絵を持っています。バックグラウンドは白、緑、黒などです。基本的にバックグラウンドを削除してバックグラウンドとの干渉なしにリーフで操作を実行できます。私はちょうど私が間違ってここに行くよどこか分からない。これにより

enter image description here

 Image<Bgr, Byte> Original = Core.CurrentLeaf.GetImageBGR; 
     Image<Gray, Byte> imgBinary = Original.Convert<Gray, Byte>(); 
     imgBinary.PyrDown().PyrUp(); // Smoothen a little bit 
     imgBinary = imgBinary.ThresholdBinaryInv(new Gray(100), new Gray(255)); // Apply inverse suppression 

     // Now, copy pixels from original image that are black in the mask, to a new Mat. Then scan? 
     Image<Gray, Byte> imgMask; 
     imgMask = imgBinary.Copy(imgBinary); 
     CvInvoke.cvCopy(Original, imgMask, imgBinary); 

     VectorOfVectorOfPoint contoursDetected = new VectorOfVectorOfPoint(); 
     CvInvoke.FindContours(imgBinary, contoursDetected, null, Emgu.CV.CvEnum.RetrType.List, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple); 

     var contoursArray = new List<VectorOfPoint>(); 
     int count = contoursDetected.Size; 
     for (int i = 0; i < count; i++) 
     { 
      using (VectorOfPoint currContour = contoursDetected[i]) 
      { 
       contoursArray.Add(currContour); 
      } 
     } 

、私は白線のほんの少しと黒画像を取得します。私は脳を前後に動かし、何かを考え出すことができなかった。どんなポインタであれ大いに感謝します!

答えて

-1

大津のしきい値を調べることをお勧めします。これは、画像を2つのクラス(バックグラウンドとフォアグラウンド)に分割するために使用できるしきい値を提供します。 OpenCVのしきい値方法を使用して、必要に応じてマスクを作成することができます。

1
  1. ContourAreaを輪郭線ごとに使用する領域が最も大きい領域が必要です。
  2. FillPolyを使用して輪郭線を塗りつぶす必要がある輪郭線は輪郭線だけであり、その中のすべてのピクセルではないため、塗りつぶす必要があります。最後は0
  3. は、元の画像

から葉のピクセルを抽出するためにマスクを使用して私はあなたにいくつかの助けを与えるためにOpenCVのとのpythonのコードを添付するように、他の私は、C#で非常に熟練していないです。

た画像:これは十分に参考になる enter image description here

希望。

import cv2 
import numpy as np 

# Read image 

Irgb = cv2.imread('leaf.jpg') 
R,G,B = cv2.split(Irgb) 

# Do some denosiong on the red chnnale (The red channel gave better result than the gray because it is has more contrast 
Rfilter = cv2.bilateralFilter(R,25,25,10) 

# Threshold image 
ret, Ithres = cv2.threshold(Rfilter,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU) 

# Find the largest contour and extract it 
im, contours, hierarchy = cv2.findContours(Ithres,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) 

maxContour = 0 
for contour in contours: 
    contourSize = cv2.contourArea(contour) 
    if contourSize > maxContour: 
     maxContour = contourSize 
     maxContourData = contour 

# Create a mask from the largest contour 
mask = np.zeros_like(Ithres) 
cv2.fillPoly(mask,[maxContourData],1) 

# Use mask to crop data from original image 
finalImage = np.zeros_like(Irgb) 
finalImage[:,:,0] = np.multiply(R,mask) 
finalImage[:,:,1] = np.multiply(G,mask) 
finalImage[:,:,2] = np.multiply(B,mask) 
cv2.imshow('final',finalImage) 
+0

これをC#に変換するためのヘルプを提供できますか?私はPythonを理解していますが、私はこの問題を自分のアプリケーションに適応させるためにC#への変換に問題があります。 – Jerry

+0

私はopencvに関係するものだけを助けることができます。あなたが困っているコードの行を教えてください。私は助けようとします。 –

関連する問題