寻找图像中的颜色:最近能做到吗?

时间:2011-12-18 16:29:24

标签: wolfram-mathematica

我正试图找到一种在图像中寻找颜色的方法。这是一个简化的例子:

tree = ExampleData[{"TestImage", "Tree"}]

tree image from Mathematica's example data set

我可以看到那里有蓝色,所以我想在像素海洋的某个地方找到一个xy位置。假设我正在寻找特定的蓝色阴影,我可以为其提供一些近似的RGB值:

Manipulate[Graphics[{RGBColor[r, g, b], Disk[]}], {r, 0, 1}, {g, 0, 1}, {b, 0, 1}] 

simple colour mixer

现在我想找到一些具有该值或足够近的像素的坐标。 Nearest可能会这样做:

Nearest[ImageData[tree], {0.32, 0.65, .8}]

但不是 - 它'产生了非常大的输出'......

这与此相反:

ImageValue[tree, {90, 90}]

如果我已经有数字,那就没关系,或者可以点击图片。一旦知道了我想要的颜色的位置,我就可以将其提供给需要“标记”的函数 - 例如RegionBinarize

我觉得必须有Mathematica功能,但还找不到......

3 个答案:

答案 0 :(得分:6)

这是

吗?
Position[#, First@Nearest[Flatten[#, 1], {0.32, 0.65, .8}]] &@
 ImageData[tree]
(*
{{162, 74}}
*)

做你想做的事吗?

好的,试试这个:

tree = ExampleData[{"TestImage", "Tree"}];

dat = Reverse[ImageData[tree]\[Transpose], {2}];

dim = Dimensions[dat][[{1, 2}]];

nearfunc = Nearest[Join @@ dat -> Tuples @ Range @ dim];

Manipulate[
  rgb = Extract[dat, Ceiling[p]];
  posns = nearfunc[rgb, num];
  Graphics[{
    Raster[dat\[Transpose]], Red, Point[posns]
   }],
  {{p, {10, 10}}, Locator},
  {{num, 20}, 1, 100, 1}
]

这使您可以单击图像上的某个位置,确定与该点的颜色最接近(根据默认标准)的点数,并显示它们。 num是要显示的点数。

看起来像这样:

Mathematica graphics

答案 1 :(得分:4)

您尝试做的事情有一些问题。

  1. 您需要一个位置坐标,而不是最近的值本身

  2. Nearest可能会返回很多值而不只是一个(使用第三个参数来指定)

  3. Nearest想要搜索的值列表,而不是表格

  4. 你可能想要这样的东西:

    Nearest[Join @@ ImageData@tree, {0.32, 0.65, .8}, 1]
    Position[ImageData@tree, #] & /@ %
    
    {{0.321569, 0.65098, 0.8}}
    {{{162, 74}}}

    如果您要动态使用它,请不要错过为效率构建NearestFunction的机会。这是一个更完整的例子:

    tree = ExampleData[{"TestImage", "Tree"}]
    
    findcolor[img_Image] :=
     DynamicModule[
      {dat, nearfunc},
      dat = ImageData@img;
      nearfunc = Nearest[Join @@ dat];
      Manipulate[
       Column[{
         Graphics[{RGBColor[r, g, b], Disk[]}],
         Position[dat, nearfunc[{r, g, b}, 1][[1]]]
         }],
       {{r, 0.5}, 0, 1}, {{g, 0.5}, 0, 1}, {{b, 0.5}, 0, 1}
       ]
      ]
    
    findcolor[tree]
    

    Mathematica graphics

答案 2 :(得分:3)

这个问题不完全是答案,但您也可能会在这个问题中找到想法:

image = ExampleData[{"TestImage", "Tree"}];
red = Image@ConstantArray[List @@ Red, ImageDimensions[image]];


threshold = 0.15;
p = ImageDimensions[image]/2;
Row[
 {VerticalSlider[Dynamic[threshold]],
  LocatorPane[
   Dynamic[p],
   Dynamic[
    colour = 
     Extract[ImageData[image], 
      Ceiling[p] /. {x_, y_} :> {ImageDimensions[image][[2]] - y, x} /. 
       0 -> 1];
    mask = 
     Binarize[ImageApply[Abs[# - colour] &, image], threshold];
    Image[
     ImageCompose[image, {SetAlphaChannel[red, mask], 0.5}],
     Magnification -> 1
     ]
    ]
   ],
  Dynamic@
   Graphics[{}, Background -> RGBColor @@ colour, 
    ImageSize -> ImageDimensions[image]]
  }
 ]

Mathematica graphics