Расширять / разрушать модифицировать ядро - PullRequest
9 голосов
/ 01 марта 2011

Я хочу сгладить контур бинаризованных изображений и считаю, что эрозия - лучший способ сделать это. Я знаю, что нормальным способом работы является использование cvDlate (src, dst, 0, iter); где 0 - это матрица 3x3.

Проблема в том, что матрица 3х3 сильно размывает мои изображения. Как я могу сделать эрозию с матрицей 2x2 или чем-то меньшим, чем матрица 3x3 по умолчанию.

Ответы [ 6 ]

22 голосов
/ 01 марта 2011

Вот вам для справки результаты использования разных ядер:

enter image description here

Saludos!

4 голосов
/ 01 марта 2011

Если ваша цель - получить бинаризованное изображение с гладкими краями, то, если у вас есть оригинал, лучше использовать что-то вроде размытия по Гауссу с cvSmooth(), прежде чем выполнять бинаризацию.

Тем не менее, вы не ограничены ядром 3x3. cvDilate() принимает IplConvKernel, созданный CreateStructuringElementEx, и вы можете создать структурирующий элемент любой (прямоугольной) формы с помощью этой функции. Тем не менее, структурирующий элемент работает по отношению к точке привязки, которая должна иметь целые координаты, так что если вы используете матрицу 2х2 матрица не может быть сосредоточена вокруг пикселя. поэтому в большинстве случаев лучше всего использовать структурирующие элементы с нечетным числом строк и столбцов.

Что вы могли бы сделать, это создать структурирующий элемент 3x3, в котором только значение центра и значения, расположенные непосредственно над, под, слева и справа от этого, равны 1:

0 1 0
1 1 1
0 1 0

вместо значения по умолчанию:

1 1 1
1 1 1
1 1 1

Первое ядро ​​создаст несколько более гладкие края.

3 голосов
/ 01 марта 2011

Вот быстрый и грязный подход, чтобы сказать вам, будет ли работать расширение / эрозия для вас:

  • Повышение качества вашего изображения.
  • Эрозия (расширение, открытие, закрытие, что угодно)с наименьшим фильтром, который вы можете использовать (обычно 3x3)
  • Уменьшите размер изображения до исходного размера
1 голос
/ 17 сентября 2014

Ядро со всеми единицами - это фильтр низких частот. Расширительный фильтр заменяет каждый пиксель в области 3X3 самым темным пикселем в этой области 3x3. Фильтр эрозии заменяет каждый пиксель в области 3х3 на самый светлый пиксель в этой области 3х3. Это если ваш фон светлый, а объект переднего плана темный. Если вы перевернете свой фон и передний план, вы также перевернете свой фильтр дилатации и эрозии.

Также, если вы хотите выполнить операцию «открытия», вы выполняете эрозию с последующим расширением. И наоборот, операция «закрыть» - это расширение, сопровождаемое эрозией. Open имеет тенденцию к удалению отдельных скоплений пикселей, а close - к заполнению дыр.

1 голос
/ 01 марта 2011

С помощью API C вы можете создать выделенный объект IplConvKernel любого типа и размера с помощью функции CreateStructuringElementEx(). Если вы используете C ++ API (функция dilate()), структурирующим элементом, используемым для расширения, является любая матрица (Mat), которую вы хотите.

0 голосов
/ 14 февраля 2013

Матрицы эрозии и расширения должны иметь нечетный порядок

- матрица 2 * 2 не может быть использована

матрицы свертки должны быть порядка 1 * 1 3 * 3 5 * 5 7 * 7 ... но ODD

попытаться применить close - Erode затем расширить операцию изображения - используйте функцию cvMorpologyEx ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...