gpt4 book ai didi

opencv - 查找图像中最大的 blob

转载 作者:行者123 更新时间:2023-12-02 17:11:25 25 4
gpt4 key购买 nike

我在使用 EmguCV 从图像中提取 blob 时遇到一些问题。我在网上看到的所有东西都使用 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);
}
}

有了这个,我得到一个带有一点白线的黑色图像。我来回绞尽脑汁,也想不出什么来。任何指针将不胜感激!

最佳答案

  • 我认为您需要在每个轮廓上使用 ContourArea 找到哪个是最大的区域。
  • 找到最大轮廓后,您需要使用 FillPoly 填充它(因为轮廓只是 blob 的放置线,而不是其中的所有像素)并创建一个掩码,该掩码作为值为 1 的叶像素,其他所有值为 0 .
  • 最后使用掩码从原始图像中提取叶子像素

  • 我对c#不是很精通,所以我用opencv在python中附加了一个代码来给你一些帮助。

    结果图像:
    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)

    关于opencv - 查找图像中最大的 blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39044886/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com