2013-03-08 3 views
1

Я работаю над проблемой расширения в C++ с opencv. Я захватил видеокарты автостоянки и, чтобы получить лучшие капли, я придумал это.Dilation Gradient w/different ROI (оптимизация blob) OPENCV

  1. Эрозия (5x5 ядра прямоугольными), 3 итерации
  2. дилатация ГРАДИЕНТНЫЕ (думают об этом, как цветной градиент вдоль оси у)

Так что я сделал, чтобы получить эту работу? Сначала мне нужно было знать 2 точки (x, y) и 2 хорошие дилатационные ядра в этих точках. С помощью этой информации можно интерполировать и экстраполировать эти значения по всему изображению. Поэтому я вычислил ROI (размер и дилатацию ядра) из этих параметров. Таким образом, каждый рентабельность инвестиций имеет собственный предопределенный ядро, используемый для расширения. Обратите внимание, что между двумя последовательными ROI (opencv rectangles) нет пробела. Все работает отлично, но есть две побочные эффекты:

  1. Buldges по бокам сгустков. Черная линия - это граница ROI! buldges picture
  2. Blobs, которые «отрезаны» от основной капли. На самом деле они не обрезаны, но ROI под одним из blob выше расширяет (я думаю, получает информацию о пикселях из вышеописанного ROI) в капли, которые разделены. Это должен быть один массивный капля. blob who shoudn't be there picture

Я пробовал все об изменении размеров ROI и оставил некоторое пространство между ними, но недостатком является то, что пятно от 2-х отделено ROI не расширено.

Так что мои вопросы:

  1. Что вызывает эти побочные эффекты точно?
  2. Что мне нужно сделать, чтобы заставить их уйти?

EDIT

Так что я нашел свое решение: при вызове функции OpenCV Разбавить, один должен быть уверен, что то же самое резюме :: Mat может быть использован в качестве конечного изображения. Если нет, вы будете использовать части оригинального и нового изображения. Таким образом, все, что мне нужно было сделать, это включить пункт назначения cv :: Mat.

ответ

0

Это не отвечает на ваш первый вопрос (что, по-видимому, вызывает эти побочные эффекты), но чтобы заставить их уйти, вы можете сделать следующий вариант: если параметры ROI дискретны и не непрерывны (как кажется в этом случае).

Вы можете вычислить дилатацию для всего изображения, используя все возможные размеры ядра. Затем, после того, как все эти двоичные изображения будут вычислены, вы можете объединить их вместе, взяв правильные образцы из правильного изображения, чтобы получить желаемое выходное изображение. Это полностью уйдет много времени, но оно должно работать без артефактов.

Как только вы подтвердите, что результаты, которые вы получили выше (которые в значительной степени гарантируют как можно более высокое качество), вы можете начать оптимизацию. Одна вещь, которую я хотел бы попробовать, - это расширить каждый из размеров ROI для вычисления расширения на размер размера ядра. Это может обойти артефакты, которые могут возникнуть из странных граничных условий.

Это приводит к моему предположению о том, что вызывает артефакты в первую очередь: всякий раз, когда вы берете конечное изображение и запускаете свертку (или морфологический оператор), вам нужно выбрать, что вы будете делать с крайними пикселями. Обычно доступ к пикселю в (-4, -1) бессмыслен, но для выполнения оператора вам потребуется, если ваше ядро ​​перекрывается с ним. Если OpenCV делает это дополнение к краям для ваших субрегионов, он очень легко может дать вам артефакты, которые вы видите.

Надеюсь, это поможет!

+0

Благодарим за отзыв, если я не нашел свое решение, это было бы моим последним средством. –