Re: Delete close, but not identical elements in an array
- To: mathgroup at smc.vnet.net
- Subject: [mg123370] Re: Delete close, but not identical elements in an array
- From: "Oleksandr Rasputinov" <oleksandr_rasputinov at hmamail.com>
- Date: Sun, 4 Dec 2011 02:51:12 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <jbcsev$bvn$1@smc.vnet.net>
On Sat, 03 Dec 2011 10:08:31 -0000, Peter Rodenbach
<peter.rodenbach at googlemail.com> wrote:
> Hi,
>
> I have the problem that I have to indentify peaks in an 2D array. I
> can do this by Ordering[] the entries in the Flatten[] list. Then I
> indentify the positions of the peaks in the array and write them into
> a list. An example I work on in an 512 x 512 Pixel array:
>
> Peaks={{229,170},{119,265},{331,202},{118,264},{314,245}}
>
> As you can see from those 5 peaks, Number 2 and 4 belong to the same
> peak. As I have to count the data at that positions and compare them,
> I have to get rid of the peak postions that neighbor each other, as
> they actually belong to the same peak.
>
> What I want now is: have Mathem. evaluate the positions in the list
> and delete those which are +-10 pixels around any other.
> So the list would look like Peaks={{229,170},{119,265},{331,202},
> {314,245}} afterwards.
>
> Thanks for the help!!
>
I guess I would suggest something along these lines (with a couple of
extra duplicates added to your example for expository purposes):
In[1] :=
pks = {
{229, 170}, {119, 265}, {331, 202}, {118, 264}, {314, 245},
{331, 203}, {113, 268}
};
In[2] :=
(* Define our distance metric *)
nf = Nearest[
pks,
DistanceFunction -> (Boole[EuclideanDistance[##] > 10] &)
]
Out[2] =
NearestFunction[{7,2}, <>]
In[3] :=
(* Gather duplicates by peak *)
dups = Rest /@ DeleteDuplicates@Select[nf /@ pks, Length[#] > 1 &]
Out[3] =
{{{118, 264}, {113, 268}}, {{331, 203}}}
In[4] :=
(* Remove duplicates *)
DeleteCases[pks, Alternatives @@ Flatten[dups, 1]]
Out[4] =
{{229, 170}, {119, 265}, {331, 202}, {314, 245}}