使用 DIPlib 检测圆
Detecting circles with DIPlib
我正在尝试检测这张图片中的圆圈:
然后使用 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,但程序无法检测到它。这是结果:
documentation for dip::FindHoughCircles
内容为:
Finds circles in 2D binary images using the 2-1 Hough transform. First, circle centers are computed using dip::HoughTransformCircleCenters
, and then a radius is calculated for each center. Note that only a single radius is returned per center coordinates.
也就是说,这个函数不能找到同心圆。
一种解决方法是 运行 函数两次,对圆的大小有不同的限制。
在 DIPlib 中,所有分配的图像(通过 dip::Image
构造函数,尽管 img.Forge()
,通过 img.Similar()
,等等)都没有被初始化。在开始绘制之前,您需要明确地将像素设置为零:detec_img.Fill(0)
。您的输出图像在下半部分很好地显示了以前的内存使用情况,我想知道是什么计算导致的! :)
我正在尝试检测这张图片中的圆圈:
根据 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,但程序无法检测到它。这是结果:
documentation for dip::FindHoughCircles
内容为:
Finds circles in 2D binary images using the 2-1 Hough transform. First, circle centers are computed using
dip::HoughTransformCircleCenters
, and then a radius is calculated for each center. Note that only a single radius is returned per center coordinates.
也就是说,这个函数不能找到同心圆。
一种解决方法是 运行 函数两次,对圆的大小有不同的限制。
在 DIPlib 中,所有分配的图像(通过 dip::Image
构造函数,尽管 img.Forge()
,通过 img.Similar()
,等等)都没有被初始化。在开始绘制之前,您需要明确地将像素设置为零:detec_img.Fill(0)
。您的输出图像在下半部分很好地显示了以前的内存使用情况,我想知道是什么计算导致的! :)