У меня есть небольшая вытравленная матрица данных на металлическом теле, которая после некоторой обработки (в серой шкале) приводит к образцам изображений. Полученное изображение в основном хорошее, за исключением некоторых областей за пределами модуля, которые имеют тот же цвет, что и внутри границ модуля. Что необходимо, так это сделать белыми только область внутри границ модуля (белая рамка).
Пробовал открыть морфинг 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
образец 3