Melhorando a detecção do círculo
Estou tentando detectar círculos nas minhas imagens. Eu escrevi o seguinte código em C # usando o EmguCV. Na maioria das vezes, ele funciona, mas há alguns casos em que ele detecta círculos menores ou maiores que são levemente deslocados para um lado.
Aqui está o meu código:
Thread.Sleep(1000);
imgCrp.Save(DateTime.Now.ToString("yyMMddHHmmss") + ".jpg");
imgCrpLab = imgCrp.Convert<Lab, Byte>();
imgIsolatedCathNTipBW = new Image<Gray, Byte>(imgCrp.Size);
CvInvoke.cvInRangeS(imgCrpLab.Split()[2], new MCvScalar(0), new MCvScalar(100), imgIsolatedCathNTipBW);
imgCrpNoBgrnd = imgCrp.Copy(imgIsolatedCathNTipBW.Not());
imgCrpNoBgrndGray = imgCrpNoBgrnd.Convert<Gray, Byte>().PyrUp().PyrDown();
Thread.Sleep(1000);
imgCrpNoBgrndGray.Save(DateTime.Now.ToString("yyMMddHHmmss") + ".jpg");
Gray cannyThreshold = new Gray(150);
Gray cannyThresholdLinking = new Gray(85);
Gray circleAccumulatorThreshold = new Gray(15);
imgCrpNoBgrndGrayCanny = imgCrpNoBgrndGray.Canny(cannyThreshold.Intensity, cannyThresholdLinking.Intensity);
Thread.Sleep(1000);
imgCrpNoBgrndGrayCanny.Save(DateTime.Now.ToString("yyMMddHHmmss") + ".jpg");
circarrTip = imgCrpNoBgrndGrayCanny.HoughCircles(
cannyThreshold,
circleAccumulatorThreshold,
1, //Resolution of the accumulator used to detect centers of the circles
500, //min distance
15, //min radius
42 //max radius
)[0]; //Get the circles from the first channel
imgCathNoTip = imgIsolatedCathNTipBW.Copy().Not();
foreach (CircleF circle in circarrTip)
{
circLarger2RemTip = circle;
circLarger2RemTip.Radius = circle.Radius;
imgCathNoTip.Draw(circLarger2RemTip, new Gray(140), 1); // -1 IS TO FILL THE CIRCLE
}
Thread.Sleep(1000);
imgCathNoTip.Save(DateTime.Now.ToString("yyMMddHHmmss") + ".jpg");
Os comandos de suspensão são apenas para garantir que os nomes dos arquivos sejam diferentes e serão removidos posteriormente. Também anexei as imagens que foram salvas por esse código durante o processo. A última imagem mostra o círculo detectado que é maior e também deslocado para a direita.
Alguém pode verificar meu código gentilmente e me informar como posso melhorá-lo para detectar círculos com mais precisão?
Desde já, obrigado.