我正试图找到一种在图像中寻找颜色的方法。这是一个简化的例子:
tree = ExampleData[{"TestImage", "Tree"}]
我可以看到那里有蓝色,所以我想在像素海洋的某个地方找到一个xy位置。假设我正在寻找特定的蓝色阴影,我可以为其提供一些近似的RGB值:
Manipulate[Graphics[{RGBColor[r, g, b], Disk[]}], {r, 0, 1}, {g, 0, 1}, {b, 0, 1}]
现在我想找到一些具有该值或足够近的像素的坐标。 Nearest
可能会这样做:
Nearest[ImageData[tree], {0.32, 0.65, .8}]
但不是 - 它'产生了非常大的输出'......
这与此相反:
ImageValue[tree, {90, 90}]
如果我已经有数字,那就没关系,或者可以点击图片。一旦知道了我想要的颜色的位置,我就可以将其提供给需要“标记”的函数 - 例如RegionBinarize
。
我觉得必须有Mathematica功能,但还找不到......
答案 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
是要显示的点数。
看起来像这样:
答案 1 :(得分:4)
您尝试做的事情有一些问题。
您需要一个位置坐标,而不是最近的值本身
Nearest
可能会返回很多值而不只是一个(使用第三个参数来指定)
Nearest
想要搜索的值列表,而不是表格
你可能想要这样的东西:
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]
答案 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]]
}
]