Мне может понадобиться больше информации, чтобы точно определить вашу проблему, но это может быть связано с вашим медианным размытием. Я бы посмотрел, достаточно ли размыто, чтобы EmguCV выглядело достаточно размытым, чтобы вы могли обнаружить границы. Другой метод, который вы можете использовать, - это Дилат. Попробуйте набрать номер вашего обнаружения края Canny и посмотрите, получите ли вы лучшие результаты.
EDIT
Вот код ниже
public List<int> GetDiameters()
{
//List to hold output diameters
List<int> diametors = new List<int>();
//File path to where the image is located
string inputFile = @"C:\Users\jones\Desktop\Image Folder\water.JPG";
//Read in the image and store it as a mat object
Mat img = CvInvoke.Imread(inputFile, Emgu.CV.CvEnum.ImreadModes.AnyColor);
//Mat object that will hold the output of the gaussian blur
Mat gaussianBlur = new Mat();
//Blur the image
CvInvoke.GaussianBlur(img, gaussianBlur, new System.Drawing.Size(21, 21), 20, 20, Emgu.CV.CvEnum.BorderType.Default);
//Mat object that will hold the output of the canny
Mat canny = new Mat();
//Canny the image
CvInvoke.Canny(gaussianBlur, canny, 40, 40);
//Mat object that will hold the output of the dilate
Mat dilate = new Mat();
//Dilate the canny image
CvInvoke.Dilate(canny, dilate, null, new System.Drawing.Point(-1, -1), 6, Emgu.CV.CvEnum.BorderType.Default, new MCvScalar(0, 0, 0));
//Vector that will hold all found contours
VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
//Find the contours and draw them on the image
CvInvoke.FindContours(dilate, contours, null, Emgu.CV.CvEnum.RetrType.External, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);
CvInvoke.DrawContours(img, contours, -1, new MCvScalar(255, 0, 0), 5, Emgu.CV.CvEnum.LineType.FourConnected);
//Variables to hold relevent info on what is the biggest contour
int biggest = 0;
int index = 0;
//Find the biggest contour
for (int i = 0; i < contours.Size; i++)
{
if (contours.Size > biggest)
{
biggest = contours.Size;
index = i;
}
}
//Once all contours have been looped over, add the biggest contour's index to the list
diametors.Add(index);
//Return the list
return diametors;
}
Первый Что вы делаете, это размытие изображения.
Затем вы можете изменить изображение.
Затем вы расширяете изображение, чтобы сделать конечные выходные контуры более однородными.
Тогда вы просто найдете контуры.
Я знаю, что окончательные контуры немного больше, чем капли воды, но это лучшее, что я мог придумать. Возможно, вы можете поиграть с некоторыми настройками и приведенным выше кодом, чтобы сделать результат немного чище.