Используйте маску в opencv, чтобы обнаружить сходство цветов - PullRequest
0 голосов
/ 24 сентября 2019

red-img

cv::Mat3b bgr = cv::imread("red_test.png");

cv::Mat3b hsv;
cvtColor(bgr, hsv, cv::COLOR_BGR2HSV);

cv::Mat1b mask1, mask2;
inRange(hsv, cv::Scalar(0, 70, 50), cv::Scalar(10, 255, 255), mask1);
inRange(hsv, cv::Scalar(170, 70, 50), cv::Scalar(180, 255, 255), mask2);

cv::Mat1b mask = mask1 + mask2;

Чтобы обнаружить красное сердце на изображении, применяется приведенный выше код, который обеспечивает 2 маскированных изображения, а именно «mask1» и'маска2.Затем я комбинирую маски, сгенерированные для обоих диапазонов красного цвета, выполняя операцию ИЛИ по пикселям.Создается следующий вывод.

enter image description here

Что мне нужно знать, это : можно ли использовать выходное изображение для обнаружениякрасный цвет на других образцах изображений?(игнорируйте форму сердца, мне интересен только цвет).

1 Ответ

0 голосов
/ 24 сентября 2019

Хотел сделать комментарий, но отформатировать его не представляется возможным.

Сейчас я не могу запустить ваш код, но после прочтения у меня есть некоторые комментарии

  1. Вывод - это просто двоичная маска для входного изображения.Его можно использовать для маскировки формы красного сердца на входном изображении , но в остальном это просто двоичное изображение, не имеющее отношения к другим изображениям.Я бы сказал, что это не принесет вам пользы для разных форм.Теоретически, вы можете использовать его для вычисления цветовой модели из исходного изображения, но это никуда не приведет, поскольку модель просто вернет вас к вашим начальным значениям порога (170: 10 градусов красного, см. Пункт 2).
  2. Две создаваемые вами маски представляют цвет, который вы ищете, и могут использоваться для любого изображения, для которого вы хотите найти красный цвет в диапазоне 170: 10 градусов с дополнительными ограничениями насыщенности и значения.Одни только эти двоичные маски сообщат вам, есть ли какой-либо пиксель в указанном диапазоне или нет.
  3. Теперь, если вы хотите узнать, есть ли красный или нет на изображении, вы можете просто взять полученный mask и сложитьзначение пикселей, либо с помощью `` `` cv :: sum or cv :: countNonZero``` и посмотрите, больше ли результат, чем 0.
  4. Для получения большего количества параметров красного объекта, вам нужно было бы сделать еще немного, но созданная вами маска - хорошее начало, но ваш вопрос был о том, чтобы просто обнаружить, поэтому не уверен, что вам нужна какая-либо морфология по линии

Попробуйте запуститьВаш код на любом изображении с несколькими цветами, и он будет производить маски для всего красного в пределах данного диапазона.

...