使用opencv在地板上突出白色胶带的图像处理技术

时间:2013-06-17 14:29:44

标签: opencv image-processing

我有以下图片:

Original

我想获得一个阈值图像,其中只有磁带是白色的,整个背景都是黑色的..到目前为止,我已经尝试过了:

Mat image = Highgui.imread("C:/bezier/0.JPG");
Mat byn = new Mat();
Imgproc.cvtColor(image, byn, Imgproc.COLOR_BGR2GRAY);
Mat thresh = new Mat();

// apply filters
Imgproc.blur(byn, byn, new Size(2, 2));
Imgproc.threshold(byn, thresh, 0, 255, Imgproc.THRESH_BINARY+Imgproc.THRESH_OTSU);
Imgproc.erode(thresh, thresh, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(4, 4)));

但是我得到了这张图片,远离我的想法:

Thresholded image

胶带总是具有相同的颜色(白色)和宽度(约2cm),任何想法?感谢

2 个答案:

答案 0 :(得分:2)

让我们看看你所知道的:

  • 胶带的对比度较低
  • 胶带比背景浅

如果您知道图片的比例,则可以在两个级别上运行自适应阈值。假设磁带的宽度为100像素:

  1. 拒绝亮度超出+/- x的像素,距离围绕它的50x50(可能更小但不大)窗口的平均亮度

  2. 拒绝亮度小于y的像素+围绕它的100x100(可能更大但不小)窗口的平均亮度。

  3. 您还应该尝试一下,尝试将均值和中位数作为每个阈值的“平均值”定义。

    从那以后你应该有一个更好定义的图像,你可以删除除最大轮廓之外的所有轮廓(可能是轨迹)

答案 1 :(得分:1)

我认为你没有利用磁带是白色的事实(地板是棕色的)。

不要使用cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY)转换为灰度,而是尝试使用会影响饱和度的自定义操作...也许就像转换为HSV并让G = V * (1-S)