#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