1

我正在尝试检测此图像中的圆圈: 图片 然后使用 C++ 中的 DIPlib 在另一个空白图像中绘制这些圆圈。

按照 Cris Luengo 的建议,我更改了代码,现在看起来像这样:

#include <iostream>
#include <vector>
#include <diplib.h>
#include <dipviewer.h>
#include <diplib/file_io.h>
#include <diplib/display.h>
#include <diplib/color.h>
#include <diplib/linear.h>
#include <diplib/detection.h>
#include <diplib/generation.h>

using namespace std;

int main()
{
    try{
    //read image
    dip::Image img;
    dip::ImageReadTIFF(img,"circle.tif");
    dip::ColorSpaceManager csm;
    img = csm.Convert(img, "grey");

    //circle detection
    //first convert the image in binary
    dip::Image bin_img = img<128;

    //Now calculate the gradient vector of the images
    dip::Image gv=dip::Gradient(img);

    //Apply the Hough transform to find the cicles
    dip::FloatCoordinateArray circles;
    circles=dip::FindHoughCircles(bin_img,gv,{},0.0,0.2);

    //Draw circles
    dip::Image detec_img= g_img.Similar(dip::DT_UINT8);
    for(auto i: circles){
                dip::FloatArray center;
                center.push_back(i[0]);
                center.push_back(i[1]);

                dip::dfloat diameter=i[2]*2;
                dip::DrawBandlimitedBall(detec_img,diameter,center, {255}, "empty");

                center.clear();
                }
    dip::ImageWriteTIFF(detec_img, "detected.tif");

我还更改了FindHoughCircles函数的参数,因为图像中有两个同心圆,所以中心之间的距离必须为 0.0,但程序无法检测到它。这是结果:

这是更新的结果

4

1 回答 1

0

文档dip::FindHoughCircles内容如下:

使用 2-1 Hough 变换在 2D 二值图像中查找圆。首先,使用 计算圆心dip::HoughTransformCircleCenters,然后计算每个圆心的半径。请注意,每个中心坐标仅返回一个半径。

也就是说,这个函数不能找到同心圆。

一种解决方法是运行该函数两次,对圆的大小有不同的限制。


在 DIPlib 中,所有分配的图像(通过dip::Image构造函数,虽然img.Forge(),通过img.Similar()等)都没有初始化。在开始绘制之前,您需要将像素显式设置为零:detec_img.Fill(0). 您的输出图像在下半部分很好地显示了以前的内存使用情况,我想知道是什么计算导致的!:)

于 2022-02-15T15:43:26.897 回答