Удалить разделенные объекты в изображении C#
Ваша помощь очень ценится. Я использую C# и EmguCV для обработки изображений
Я пробовал удаление шума, но ничего не происходит. Я также попробовал медианный фильтр изображения, и он работает только на первом изображении, но не работает на втором изображении. Это только делает второе изображение размытым, а объекты - более крупными и более квадратными.
Я хочу удалить явно отличающиеся объекты(зеленые) на моем изображении ниже, чтобы оно стало черным, потому что они явно разделены и не сгруппированы в отличие от второго изображения ниже.
Изображение 1:
Таким же образом, я хочу сделать это на моем изображении ниже, но удалить только те объекты - (черные), которые не сгруппированы /(сосредоточены?), Так что на изображении остаются объекты, которые сгруппированы / больше в масштабе?
Изображение 2:
Спасибо
2 ответа
Вы должны сначала пороговое изображение, используя метод Otsus. Второй запуск анализа связанных компонентов на пороговом изображении. В-третьих, просмотрите все компоненты, которые вы нашли, и те, которые имеют размер меньше, чем минимальный размер, удалите его из исходного изображения.
- cvThreshold (с CV_THRESH_BINARY/CV_THRESH_BINARY_INV(выберите в соответствии с изображением) + CV_THRESH_OTSU) http://www.emgu.com/wiki/files/1.3.0.0/html/9624cb8e-921e-12a0-3c21-7821f0deb402.htm : h http://www.emgu.com/wiki/files/1.3.0.0/html/bc08707a-63f5-9c73-18f4-aeab7878d7a6.htm
- CvInvoke.FindContours (RetrType == Внешний,ChainApproxNone)
- Для каждого найденного в 2 контура рассчитайте CvInvoke.ContourArea
- Если область меньше, чем minArea, нарисуйте на исходном изображении (то, которое вы хотите отфильтровать) требуемое для них значение (я полагаю, 0) в исходном изображении, используя CvInvoke.DrawContours с текущим контуром и толщиной ==-1 для заполнить внутри контура.
Вы можете попробовать Gaussian Blur и затем применить Threshold к изображению.
Размытие по Гауссу - широко используемый эффект в графическом программном обеспечении, обычно для уменьшения шума изображения и детализации, что, я думаю, хорошо соответствует вашим требованиям.
Для вашего первого изображения:
CvInvoke.GaussianBlur(srcImg, destImg, new Size(0, 0), 5);//You may need to customize Size and Sigma depends on different input image.
Ты получишь:
затем
CvInvoke.Threshold(srcImg, destImg, 10, 255, Emgu.CV.CvEnum.ThresholdType.Binary);
Ты получишь:
Для вашего второго изображения:
CvInvoke.GaussianBlur(srcImg, destImg, new Size(0, 0), 5);//You may need to customize Size and Sigma depends on different input image.
Ты получишь:
затем
CvInvoke.Threshold(srcImg, destImg, 240, 255, Emgu.CV.CvEnum.ThresholdType.Binary);
Ты получишь:
Надеюсь, это поможет!