Поиск цветов в изображениях: может ли это сделать Ближайший? - PullRequest
7 голосов
/ 18 декабря 2011

Я пытаюсь найти способ искать цвета в изображениях.Вот упрощенный пример:

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 ]

6 голосов
/ 18 декабря 2011

Это

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

4 голосов
/ 18 декабря 2011

Есть несколько проблем с тем, что вы пытаетесь сделать.

  1. Требуется координата позиции, а не само ближайшее значение

  2. Nearest может возвращать множество значений, а не только одно (для указания используйте третий аргумент)

  3. Nearest хочет, чтобы список значений для поиска, а не таблица

Вы, вероятно, хотите что-то вроде этого:

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

Не упустите шанс построить ближайшую функцию для эффективности, если выбудем использовать это динамически.Вот более полный пример:

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

3 голосов
/ 20 декабря 2011

Не совсем ответ на вопрос, но вы можете найти идеи и в этом:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...