1

我有以下图像:

原来的

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

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)));

但是我得到了这个图像,这与我想要的相去甚远:

阈值图像

胶带总是具有相同的颜色(白色)和宽度(约 2 厘米),知道吗?谢谢

4

2 回答 2

2

让我们看看你知道什么:

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

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

  1. 从周围的 50x50(可能更小,但不是更大)窗口的平均亮度中拒绝亮度超出 +/- x 的像素,并且

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

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

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

于 2013-06-17T15:22:19.093 回答
1

我认为您没有利用胶带是白色的事实(并且地板是棕色的)。

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

于 2013-06-17T15:34:06.090 回答