Заполнение контура датаматрицы для сканирования - PullRequest
0 голосов
/ 03 августа 2020

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

Пробовал открыть морфинг Opencv с последующим закрытием, но результаты невысокие (декодирование не происходит). Также пробовал Canny edge и fill contour, но это вносит шум. Теоретически я мог бы удалить некоторые контуры, но это привело бы к неточному изображению, так как некоторые контуры (в основном черная область) размещаются внутри контуров, которые нуждаются в раскраске, что приведет к неточным результатам (или отсутствию сканирования).

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

// In Java, ZXing is being used to read the pre-processed image
// based on processed bytearray returned from native

// Native process, takes input 480x640 image, crops based on view finder 
// which is when we have a 213x213 sized image
cv::resize(img, img, Size(600, 600));

labelUtils.BrightnessAndContrastAuto(img, img);

// identify contour area of datamatrix and crop the selection
vector<Point> contourPoints;
getDataMatrixContour(img,contourPoints);
if (contourPoints.empty) {
   threshold(img, img, 100, 255, THRESH_BINARY_INV);
   return;
}
// get contour rect which has the code
Rect icRect = cv::boundingRect(contourPoints);
//            double scaleFactor = desiredWidth / icRect.width;

// resize bounding rect to have some padding area
LabelUtils::resizeRect(icRect, 1.2);

// make rect even, else cvtColor color fails for odd-sized images
if (icRect.width % 2 != 0)
   icRect.width += 1;
if (icRect.height % 2 != 0)
   icRect.height += 1;

// crop image to a (sub)scaled even size
labelUtils.submatImage(pImg, icRect);

int sigma = 2, threshold = 5, amount = 10;
sharpenForMetal(img, sigma, threshold, amount);

threshold(img, img, 100, 255, THRESH_BINARY_INV);
return;

образец 1 sample 2 образец 3

1 Ответ

0 голосов
/ 05 августа 2020

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

...