C# 在EMGUCV C中从图像中提取圆形区域#

C# 在EMGUCV C中从图像中提取圆形区域#,c#,emgucv,area,detect,C#,Emgucv,Area,Detect,我使用: Emgucv 4.0.1 Opencv 4.1.0 我用HoughCircles函数检测了一系列的圆,需要逐一分析。 我需要计算圆形绿色圆圈中有多少颜色,所以我必须只提取圆圈图像,但我知道如何只提取包含比圆圈更多像素的方框。如何仅提取周围绿色区域内的图像? 请参阅下面链接中的图像 //m_ListCircles=HoughCircles()圆坐标的列表。 //cell=要提取的单元格编号。 //pictureBox1=检测到所有圆圈的主picturebox。 //pictureB

我使用: Emgucv 4.0.1 Opencv 4.1.0

我用HoughCircles函数检测了一系列的圆,需要逐一分析。 我需要计算圆形绿色圆圈中有多少颜色,所以我必须只提取圆圈图像,但我知道如何只提取包含比圆圈更多像素的方框。如何仅提取周围绿色区域内的图像? 请参阅下面链接中的图像

//m_ListCircles=HoughCircles()圆坐标的列表。
//cell=要提取的单元格编号。
//pictureBox1=检测到所有圆圈的主picturebox。
//pictureBoxROI=picturebox目的地单圈切割。
int id=(int)m_列表圈[0+单元格];
int x=(int)m_列表圈[1+单元格];
int y=(int)m_列表圈[2+单元格];
int r=(int)m_列表圈[3+单元格];//半径
//圆周围的长方体区域
int X0=x;
int Y0=y;
int X1=x+r*2;
int Y1=y+r*2;
//要复制的区域
int-wid=Math.Abs(X0-X1);
int hgt=数学绝对值(Y0-Y1);
如果((wid<1)|(hgt<1))返回;
//创建要复制的矩形
矩形源_矩形=新矩形(数学最小值(X0,X1),数学最小值(Y0,Y1),wid,hgt);
//将复制的区域指定给图像变量
var image=新图像(新位图(pictureBox1.image));
image.ROI=源\矩形;
//显示图像
pictureBoxROI.Image=Image.Bitmap;
pictureBoxROI.Refresh();
/*
//尝试此操作,但结果始终为黑色图像。
点xyCell=新点();
xyCell.X=X0;
xyCell.Y=Y0;
图像掩码=新图像(Image.Width、Image.Height);
CvInvoke.Circle(掩码、xyCella、r、新MCvScalar(255、255、255),-1,
LineType.AntiAlias,0);
Image dest=新图像(Image.Width、Image.Height);
dest=图像和(图像、遮罩);
pictureBoxROI.Image=dest.Bitmap;
pictureBoxROI.Refresh();
*/

只能有矩形图像。但是,在剪切矩形后,可以将圆外的所有像素设置为透明。
通过使用毕达哥拉斯计算像素与图像中心点的距离,可以确定哪些像素位于圆之外。 这当然是非常慢的,因为您必须在所有像素上循环,但对于低像素计数,它相当快

try
{
    Image rectCroppedImage = originalImage.Clone(CropRect, originalImage.PixelFormat);
    double r = rectCroppedImage.Height; // because you are centered on your circle

    Bitmap img = new Bitmap(rectCroppedImage);

    for (int x = 0; x < img.Width; x++)
    {
        for (int y = 0; y < img.Height; y++)
        {
            // offset to center
            int virtX = x - img.Width / 2;
            int virtY = y - img.Height / 2;

            if (Math.Sqrt(virtX * virtX + virtY * virtY) > r)
            {
                img.SetPixel(x, y, Color.Transparent);
            }
        }
    }
    return img; // your circle cropped image
}
catch (Exception ex)
{
}
试试看
{
Image rectcropeImage=originalImage.Clone(CropRect,originalImage.PixelFormat);
double r=rectcropeImage.Height;//因为您位于圆的中心
位图img=新位图(矩形裁剪图像);
对于(int x=0;xr)
{
设置像素(x,y,彩色,透明);
}
}
}
return img;//您的圆形裁剪图像
}
捕获(例外情况除外)
{
}

这也可以通过使用遮罩并将图像与白色圆圈“相乘”来实现。这样的事情可以通过图像魔法来实现。您可以在此处找到ImageMagick NuGet数据包:

您只能有矩形图像。但是,在剪切矩形后,可以将圆外的所有像素设置为透明。
通过使用毕达哥拉斯计算像素与图像中心点的距离,可以确定哪些像素位于圆之外。 这当然是非常慢的,因为您必须在所有像素上循环,但对于低像素计数,它相当快

try
{
    Image rectCroppedImage = originalImage.Clone(CropRect, originalImage.PixelFormat);
    double r = rectCroppedImage.Height; // because you are centered on your circle

    Bitmap img = new Bitmap(rectCroppedImage);

    for (int x = 0; x < img.Width; x++)
    {
        for (int y = 0; y < img.Height; y++)
        {
            // offset to center
            int virtX = x - img.Width / 2;
            int virtY = y - img.Height / 2;

            if (Math.Sqrt(virtX * virtX + virtY * virtY) > r)
            {
                img.SetPixel(x, y, Color.Transparent);
            }
        }
    }
    return img; // your circle cropped image
}
catch (Exception ex)
{
}
试试看
{
Image rectcropeImage=originalImage.Clone(CropRect,originalImage.PixelFormat);
double r=rectcropeImage.Height;//因为您位于圆的中心
位图img=新位图(矩形裁剪图像);
对于(int x=0;xr)
{
设置像素(x,y,彩色,透明);
}
}
}
return img;//您的圆形裁剪图像
}
捕获(例外情况除外)
{
}

这也可以通过使用遮罩并将图像与白色圆圈“相乘”来实现。这样的事情可以通过图像魔法来实现。你可以在这里找到ImageMagick NuGet包:

你可以从找到的圆圈中创建ROI的遮罩,并像这样分析图像


-这显示了如何使用遮罩

您始终可以从找到的圆中创建ROI遮罩,并像这样分析tha图像


-这显示了如何使用掩码

这是什么的可能副本?看起来很有趣。这可能是什么的复制品?看起来很有趣。非常感谢你的代码!它工作得很好。“我在公众评分方面没有什么名气,对不起。@user3512156您仍然可以接受答案。”。当你找到合适的代表时,你的投票将被保存并发出。非常感谢你的代码!它工作得很好。“我在公众评分方面没有什么名气,对不起。@user3512156您仍然可以接受答案。”。当你得到适当的建议时,你的赞成和反对将会被保留,即使它看起来是C++。Emgu是一个围绕C++ OpenCV的包装器,即使它看起来像C++,也几乎完全是有趣的建议。Emgu是C++ C++ OpenCV的包装器,几乎完全相同。