Обработка изображений в режиме реального времени: шум в изображении HSV (openCV)

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

  1. Взять данные с камеры можно обрезать, чтобы получить ROI.
  2. Преобразование изображения ROI из RGB в пространство HSV.
  3. Использование медианного фильтра для снижения шума в изображении HSV.
  4. Пороговое изображение
  5. Использование расширения и эрозии, чтобы удалить маленькие отверстия и мелкие объекты в изображении
  6. Использование findContours и окPolyDP для обнаружения квадратных объектов.

Это моя фаза предварительной обработки:

image_cv = cv::cvarrToMat(image_camera);
Mat cropped = image_cv(cv::Rect(0, 190, 640, 110));
imshow("origin", cropped);
Mat croppedCon = CropConveyor(cropped);
cv::cvtColor(croppedCon, croppedCon, CV_RGB2HSV);
medianBlur(croppedCon, croppedCon, 3);
cv::Mat binRect;
cv::inRange(croppedCon, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), binRect);

Это код для обнаружения квадратов:

vector<vector<Point>> contours;
findContours(binarizedIm, contours, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);

vector<Point> approx;
for (size_t i = 0; i < contours.size(); i++)
{
//double arclength = arcLength(Mat(contours[i]), true);
approxPolyDP(Mat(contours[i]), approx, 3.245 , true);   //0.04 for wood
if (approx.size() != 4) continue;
if (isContourConvex(Mat(approx)) && contourArea(Mat(approx)) > 250)
{
double MaxCos = 0;
for (int j = 2; j < 5; j++)
{
double cos = angle(approx[j % 4], approx[j - 1], approx[j - 2]);
MaxCos = MAX(cos, MaxCos);
}

if (MaxCos < 0.2)
squares.push_back(approx);
}
}

Я думаю, что шум в HSV Image является основной причиной. Вот несколько изображений, иллюстрирующих мои проблемы. Я видел много шума в HSV Image, поэтому я использую медиа-фильтр для него, чтобы уменьшить шум, но сохранить края, потому что я думаю, что информация о краях очень важна при использовании функции findContours.
HSV и HSV в отдельных каналах
Мой вопрос:

  • Что такое шум в изображении HSV, обратитесь к изображению выше, как я могу
    улучшить качество моего изображения?

0

Решение

Причиной шума в вашем изображении насыщенности является шум во входном изображении. Вызывается плохой камерой / оптикой и еще больше усиливается сжатием JPEG.

Это худшее изображение, которое я видел за последние годы. Вы не должны вкладывать еще одну секунду в обработку этого, если вы не живете на Марсе и не нуждаетесь в результатах завтра.

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

Первое правило обработки сигналов:

дерьмо = дерьмо

Вы можете получить гораздо лучшие камеры в основном бесплатно. Найдите и используйте один.

2

Другие решения

Частично проблема заключается в том, что вы делаете шумоподавление в пространстве HSV. В вашем примере вы можете видеть, что V-канал ведет себя лучше, чем H и S. Было бы лучше сделать шумоподавление в RGB (которое является более линейным и ближе, хотя и не идентичным, к собственному цветовому пространству камеры, где шум происходит, конечно, есть и гамма-коррекция).

Может быть, стоит подумать о более сильном, сохраняющем края шумоподавляющем фильтре, таком как Двусторонний фильтр.

1

Я не понимаю, почему вы используете HSV для сегментирования объектов, изображение RGB достаточно хорошее. Разделите изображение на 3 канала (r, g, b) и примените к ним адаптивный порог. расширить и размять изображения, затем добавить (не объединяя) эти 3 двоичных изображения, чтобы получить одно двоичное изображение. Наконец сделайте уровень 6 вашего рецепта, чтобы извлечь объекты. Если шум все еще влияет на результат, примените двусторонний фильтр к каналам r, g, b до порогового значения.

1
По вопросам рекламы [email protected]