Удалите шипы/треугольники на изображении

#opencv #image-processing #emgucv #contour

Вопрос:

У меня есть изображение с шипами/маленькими треугольниками на границе контура, вот так:

Оригинальное изображение

Я хотел бы удалить ненужные шипы/маленькие треугольники:

Нежеланные шипы

И выведите изображение следующим образом:

Целевое изображение

Я искал много постов в Интернете, используя резюме OpenCV/Emgu, но безуспешно. Проблема в том, что контур находится на неравном расстоянии, и я не могу использовать функции поиска пиков, чтобы найти их и удалить.

Я также использовал кубический сплайн для сглаживания изображения, но он просто разрушил исходную форму изображения (слишком гладкую) или просто немного повлиял на шипы.

Может ли кто-нибудь, у кого есть идеи, помочь мне в этом вопросе?

Комментарии:

1. Вы пробовали морфологическое закрытие?

2. Внимание, вам нужно быть очень конкретным в отношении того, что является спайком, а что нет. Алгоритм не может угадать, что вы имеете в виду, и «но это очевидно» не может быть закодировано в программе. Можете ли вы дать однозначное определение спайка ?

3. @Крис Луэнго, я пытался это сделать, но из-за этого были удалены тонкие линии и получилась более гладкая форма.

4. @Ив Дауст, я полностью понимаю ваш комментарий, и именно поэтому мне это очень сложно. На самом деле, я должен назвать ненужные маленькие треугольники на форме. В моем случае реальной практики маленькие треугольники находятся на фиксированных положениях объекта. Но есть большая проблема, вызывающая трудности с их устранением для меня. Один из них заключается в том, что ориентация объекта может варьироваться в диапазоне углов (например, /- 15 градусов), и это делает точки контуров различными по распределению и начальной точке.

5. «о фиксированных положениях объекта»: как это может быть ? Вы имеете в виду, что объект всегда один и тот же ??

Ответ №1:

Как предположил Крис, морфологическое закрытие является хорошей отправной точкой.

На рисунке ниже я выполнил закрытие с помощью восьмигранного ядра 49×49 (лучше было бы круглое) и взял разницу с оригиналом.

Если вы отфильтруете капли по размеру (и, возможно, по форме), вы получите истинные всплески, которые вы можете вычесть. Остальная часть формы остается неизменной.

введите описание изображения здесь

введите описание изображения здесь

Комментарии:

1. Спасибо тебе, Ив, за это. Я думаю, что это хорошо для меня, чтобы попробовать. Из моего предыдущего комментария я приношу извинения за то, что не очень хорошо использую морфологическое закрытие. Если вы можете поделиться со мной своим примером кода, это будет очень полезно, но я думаю, что все еще могу попробовать сам. Апприате!

2. @HsiehJeremy: «Я не настолько хорош в использовании морфологического закрытия», что вы имеете в виду, это всего лишь два вызова функций ?

3. У меня все работает так, как вы показали выше. ^^

Ответ №2:

Что — то подобное тоже поможет.

Где:

  • @контуры-это ваш список контуров после findContrours()
  • @idx — это индекс вашего контура
  • @eps регулирует, насколько приближен контур.
                  cv::Mat approx;
                 double eps = cv::arcLength(contours[idx], true) * 0.05;
                 cv::approxPolyDP(contours[idx], approx, eps, true);
                 approx.copyTo(contours[idx]);
     

Ответ №3:

Может быть, это то, что вы хотите (это совсем не точно)

OpenCV Python

 # Import preprocessors
import os
import cv2
import numpy as np

# Read image
dir = os.path.abspath(os.path.dirname(__file__))
im = cv2.imread(dir '/im.png')

# Remove triangles
kernel = np.ones((5,5), np.uint8)
factor=11
im = cv2.dilate(im, kernel, iterations=factor)
im = cv2.erode(im, kernel, iterations=factor)

# Save the processed image
cv2.imwrite(dir '/spike_res.png', im)
 

введите описание изображения здесь


Обновить:

Возможно, это не связано с тегом OpenCV; но с .NET вы также можете использовать размывание и набор AForge.

Комментарии:

1. Спасибо Шамширсазу. Я использую .Net C#, и я должен проверить, есть ли numpy для C#.

2. Добро пожаловать 🙂 Я думаю, что вы также можете использовать AForge для C# @HsiehJeremy