我在金属体上有一个小的蚀刻数据矩阵,经过一些处理(灰度)后,会产生样品图像。除了模块外部的某些区域与模块边界内的颜色共享相同的颜色外,生成的图像大部分都很好。只需将模块边界内的区域(白色边框)设为白色。
尝试先打开Opencv变体,然后再关闭,但效果不佳(不会发生解码)。还尝试了Canny边缘和填充轮廓,但这会引入噪点。从理论上讲,我可以删除一些轮廓,但这会导致图像不准确,因为某些轮廓(主要是黑色区域)位于需要着色的轮廓内,并且会导致结果不准确(或不扫描)。
实现此目标的最佳方法是什么(需要较少的图像/点击审判)。白色边界内的区域将根据入射光角度而变化(水平或垂直间隙)。
// 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;
答案 0 :(得分:0)
图像清晰度下降是由于使用了调整大小而不是单应变换。调整大小会导致图像丢失,而单应性保留了我所拥有的进一步处理管线所需的细节。