обработка изображения: улучшение алгоритма для 'кока-колы' признание


image processing'cans'green rectangle

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

template matching

некоторые ограничения на проекте:

  • the background could be very noisy.
  • the can could have any scale or rotation or even orientation (within reasonable limits).
  • the image could have some degree of fuzziness (contours might not be entirely straight).
  • there could be coca-cola bottles in the image, and the algorithm should only detect the can!
  • the brightness of the image could vary a lot (so you can't rely "too much" on color detection).
  • the can could be partly hidden on the sides or the middle and possibly partly hidden behind a bottle.
  • there could be no can at all in the image, in which case you had to find nothing and write a message saying so.
  • так что вы могли бы в конечном итоге с хитрой вещи, как этот (который в данном случае был мой алгоритм полностью не удастся):

    total fail

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

    languageopencv

    : сделано в c с использованием библиотеки.

    pre-processing

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

  • changing color domain from rgb to hsv and filtering based on "red" hue, saturation above a certain threshold to avoid orange-like colors, and filtering of low value to avoid dark tones. the end result was a binary black and white image, where all white pixels would represent the pixels that match this threshold. obviously there is still a lot of crap in the image, but this reduces the number of dimensions you have to work with. binarized image
  • noise filtering using median filtering (taking the median pixel value of all neighbors and replace the pixel by this value) to reduce noise.
  • using canny edge detection filter to get the contours of all items after 2 precedent steps. contour detection
  • algorithmthisgeneralized hough transform

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

  • you can describe an object in space without knowing its analytical equation (which is the case here).
  • it is resistant to image deformations such as scaling and rotation, as it will basically test your image for every combination of scale factor and rotation factor.
  • it uses a base model (a template) that the algorithm will "learn".
  • each pixel remaining in the contour image will vote for another pixel which will supposedly be the center (in terms of gravity) of your object, based on what it learned from the model.
  • в конце концов, вы в конечном итоге с тепловая карта голосов, например здесь все пикселы контура, можно будет голосовать за своего гравитационного центра, так что вы будете иметь много голосов в одной и той же точке, соответствующей центру, и увидите пик в жару карте, как показано ниже:

    ght

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

    results

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

  • it is extremely slow! i'm not stressing this enough. almost a full day was needed to process the 30 test images, obviously because i had a very high scaling factor for rotation and translation, since some of the cans were very small.
  • it was completely lost when bottles were in the image, and for some reason almost always found the bottle instead of the can (perhaps because bottles were bigger, thus had more pixels, thus more votes)
  • fuzzy images were also no good, since the votes ended up in pixel at random locations around the center, thus ending with a very noisy heat map.
  • in-variance in translation and rotation was achieved, but not in orientation, meaning that a can that was not directly facing the camera objective wasn't recognized.
  • specificexclusively opencvfour specific

    вы можете помочь мне улучшить мой алгоритм, используя возможности, для решения перечисленных проблем?

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