如何从图像中分割出大面积的灰色(从白色到黑色)? (如果您在opencv中知道这一点,则可以通过说出在opencv中的操作来回答)。例如,给出以下图片:



您会看到这是一个很大的灰色区域,可以与其他区域明显地区分开。如果该区域可以具有任何灰色阴影并且必须实时工作,该如何对其进行分段。

评论

我看到几个明显可以区分的灰色区域。您能显示您想要的结果吗?

我想要的结果是中间灰色矩形的右上角和左上角的坐标以及左下角的坐标

您能否告诉我们有关环境和您需要处理的图像中潜在差异的其他信息?目标将始终位于图像的中间吗?是否还会有其他可能大小相同的灰色矩形?如果它们显示为相同的灰色阴影怎么办?我们还有其他可以用来识别它的东西吗?它的顶部总是有小的“ T”形吗?

嗨,目标永远不会一直在图片的中间。目标始终是某种矩形。 (它也可以只是一堵墙)。如果有多个矩形,则也应将其检测出来,但它们应较大。小区域可以丢弃。如果它们全部显示为相同的灰色,则应该全部检测到它们,但是发生这种情况的机会很小。可以检测到的唯一真实属性是,表面在整个表面上将具有相同的灰色(或多或少),并且是矩形。每次都不会有一个小的T形顶部

#1 楼

使用分水岭算法或图形切割,您将对灰色区域进行合理的分割。 opencv中提供了分水岭,但尚未提供图形切割。
(顺便说一句,这是Kinect的深度图吗?)

评论


$ \ begingroup $
opencv中的分水岭功能需要一个8位3通道图像作为输入。我的深度图是一个8位1图像。任何想法如何解决这个问题?
$ \ endgroup $
– Olivier_s_j
2011年12月6日在18:07

$ \ begingroup $
/ *获取图像属性/ width = src-> width; height = src-> height; /为灰度版本创建新图像* / IplImage * dst = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1); cvCvtColor(src,dst,CV_RGB2GRAY);
$ \ endgroup $
–nav
2011-12-7 13:25



$ \ begingroup $
另一个问题,我只是在另一个图像中使用了分水岭函数(仅来自opencv的示例)。但它们始于彩色图像和二进制图像。我只有1张图片... grascale图片。任何关于掩码应该是什么的想法(第二个输入变量)?
$ \ endgroup $
– Olivier_s_j
2011年12月7日17:06

#2 楼

在Mathematica中,您可以执行以下操作:

Colorize[MorphologicalComponents[
  ColorNegate@
   Erosion[Dilation[
     DeleteSmallComponents[
      Erosion[Binarize[
        GradientFilter[
         ColorConvert[Import@"http://i.stack.imgur.com/XdnaW.png", 
          "RGB"], 2], .015], 1], 100], 2], 2]], 
 ColorFunction -> "ThermometerColors"]




您可以将此代码转换为任何图像处理库。

评论


$ \ begingroup $
嗨,看起来不错。但是我没有数学。但是我猜你是根据这张图片的灰度使用阈值的?也许您可以在代码中提供一些信息?谢谢
$ \ endgroup $
– Olivier_s_j
2011-12-10 12:56

$ \ begingroup $
@Ojt对于每个命令,您可以阅读“ reference.wolfram.com/mathematica/ref/xxx.html”以获取描述。例如reference.wolfram.com/mathematica/ref/…
$ \ endgroup $
– belisarius博士
2011-12-10 15:30

$ \ begingroup $
好吧,我按照你的建议做了。但是似乎您正在使用Binarize将阈值设置为给定值。就我而言,这是不可能的。由于的大面积区域可能具有不同的灰色阴影。 (例如,中间表面可能是非常浅的灰色)。然后阈值将不起作用。
$ \ endgroup $
– Olivier_s_j
2011-12-10 16:24