MathGroup Archive 2011

[Date Index] [Thread Index] [Author Index]

Search the Archive

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}}



  • Prev by Date: Re: reducing the size of a Manipulate slider control, problem when using ImageSize
  • Next by Date: Re: Plot Legends For Side By Side Graphs
  • Previous by thread: Re: Delete close, but not identical elements in an array
  • Next by thread: Plot Legends For Side By Side Graphs