Я использую EmguCV для простой обработки изображений. Я хочу удалить небольшие контуры из своего порогового изображения, поэтому я использовал connectedcomponentswithstats . Ниже приведен мой код, где я преобразую любой пиксель, меньший, чем минимальный размер, в черный - по сути, удаляя его Причина, по которой я хочу это сделать, заключается в возможности использовать его в последней части, поскольку он не совместим с другими типами.
public Mat Filtered(Mat in_img, string currentDir)
{
Mat gray_res = new Mat();
Mat labels = new Mat();
Mat stats = new Mat();
Mat centroids = new Mat();
CvInvoke.CvtColor(in_img, gray_res, ColorConversion.Bgr2Gray);
var nlabels = CvInvoke.ConnectedComponentsWithStats(gray_res, labels, stats, centroids, LineType.EightConnected);
int min_size = 250;
int[] sizes = new int[nlabels];
for (int s = 1; s < nlabels; s++)
{
sizes[s] = BitConverter.ToInt32(stats.GetData(s, (int)ConnectedComponentsTypes.Area), 0);
}
Matrix<double> fltr_img = new Matrix<double>(labels.Rows, labels.Cols);
fltr_img.SetValue(0);
for (int i = 1; i < nlabels; i++)
{
int j = BitConverter.ToInt32(stats.GetData(i, (int)ConnectedComponentsTypes.Left), 0); //left most
int w = BitConverter.ToInt32(stats.GetData(i, (int)ConnectedComponentsTypes.Width), 0); //run width
int k = BitConverter.ToInt32(stats.GetData(i, (int)ConnectedComponentsTypes.Top), 0); //top most
int h = BitConverter.ToInt32(stats.GetData(i, (int)ConnectedComponentsTypes.Height), 0); //run height
if (sizes[i] < min_size)
{
for (int a = k; a < k + h; a++)
{
for (int b = j; b < j + w; b++)
{
fltr_img.Data[a, b] = 255;
}
}
}
}
//Covnert 2D Matrix to Image
CvInvoke.Imwrite(currentDir + "filter.jpg", fltr_img);
Mat subtrahend = CvInvoke.Imread(currentDir + "filter.jpg");
Mat fnl_img = new Mat();
CvInvoke.Subtract(in_img, subtrahend, fnl_img);
return fnl_img;
}
В конце я сделал небольшой подвох, чтобы преобразовать маску в совместимый тип Мат , который является исходным изображением. С этим кодом я получаю свой результат, но он все еще беспокоит меня.