What is the best way to store groups of 3 nearest non-zero pixels?
You are now following this question
- You will see updates in your followed content feed.
- You may receive emails, depending on your communication preferences.
An Error Occurred
Unable to complete the action because of changes made to the page. Reload the page to see its updated state.
Show older comments
0 votes

I would like to identify and store each set of 3 closest points (as seen in the attached image) in a separate variable. So in this case, there would be three variables created--one for each set of three points. What would be the most efficient way to do this? Thanks in advance for your help!
1 Comment
Walter Roberson
on 6 Sep 2019
image appears to be blank??
Accepted Answer
I would like to identify and store each set of 3 closest points (as seen in the attached image) in a separate variable.
No, you should not organize the result that way. What you should do is create a cell array called Triplets, such that Triplets{i} contains the points in the i-th triplet as a 2x3 matrix.
[I,J]=find(~yourImage);
X=[I,J];
[D,K]=pdist2(X,X,'euclidean','Smallest',3); X=X.';
K=unique( sort(K).', 'rows').'; K=K(:);
assert(numel(unique(K))==numel(K) ,'Points not well-separated enough for threshold' );
Triplets=num2cell( reshape( X(:,K), 2,3,[] ) ,[1,2]);
Triplets=Triplets(:).';
25 Comments
When I run this on your posted image, I obtain
>> Triplets{:}
ans =
54 14
259 310
184 138
ans =
71 17
274 250
202 674
ans =
51 67
260 302
715 731
Steve
on 6 Sep 2019
Thanks so much for your input. Looks great. I see you have the groups (sets of 3) all stored in one variable called "Groups". How do I get each set of 3 (x,y) coordinate pairs stored into their own variable (3 points per variable), so that I can call on them individually? Thanks again for your help!
Matt J
on 6 Sep 2019
How do I get each set of 3 (x,y) coordinate pairs stored into their own variable (3 points per variable), so that I can call on them individually?
If you know there will always be 3 triplets, you can do
[T1,T2,T3]=deal(Triplets{:});
Steve
on 6 Sep 2019
Thanks again for your input. There will usually be hundreds of triplets.
Then you should NOT separate them into individual variables. See,
Steve
on 6 Sep 2019
If they are stored in one variable, how do I call on each of the triplet sets individually?
Matt J
on 6 Sep 2019
By indexing, e.g., instead of T105 you would write Triplets{105}.
Steve
on 6 Sep 2019
Ok, cool. Last question (I hope)...How do I plot the triplets with index labels over the original image?
Steve
on 6 Sep 2019
It's still running...I'm trying it with a bunch of triplets.
Matt J
on 6 Sep 2019
I found some errors in the original code and edited it. The Triplets{i} are now returned as 2x3 matrices, but that is easy to change if it is not prefered.
Steve
on 6 Sep 2019
MATLAB stopped and said "out of memory". Can I do this in a more efficient way? Thanks again for all your help.
I don't see why you would be running out of memory. I suggest you attach your image in a .mat file so it can be investigated.
How do I plot the triplets with index labels over the original image?
In the meantime, I demonstrate below how to add labels to the triplets on your originally posted image with the attached plotpts2D.m file
C=cell2mat(cellfun(@(z)mean(z,2),Triplets,'uni',0) );
imshow(yourImage); hold on; plotpts2D(flipud(C)); hold off;
This will show,

Steve
on 6 Sep 2019
Keeps throwing errors...

Steve
on 6 Sep 2019
Got it!
Matt J
on 6 Sep 2019
what does
>> whos C
show?
Steve
on 6 Sep 2019
The only thing is when you zoom in to the plot, the index numbers pull away from the blue dots.
Steve
on 6 Sep 2019

Steve
on 6 Sep 2019


You can modify this line of plotpts2D to suit your preferences,
dd=diff(ylim)/20;% HARDCODE for now
It controls the spacing between the point and the label.
Matt J
on 6 Sep 2019
Steven's comment moved here:
It's not that they re far from the points, it's more that they appear random (some are close, and some are far).

it's more that they appear random (some are close, and some are far).
No, that's an illustion. The labels that appear to you to be close to a point really belong to a different point farther away. The distance between a point and its label is set uniformly in the code to the dd parameter in that line I showed you. It cannot vary from point to point.
Steve
on 6 Sep 2019
I set the parameter to: dd=diff(ylim)/2000; and it worked perfectly. You are amazing. What is the best way to officially rate your help and effort so you get the most credit?
For anyone reading this, Matt J is the best! A+
Matt J
on 6 Sep 2019
Glad it worked. Just Accept-click the answer and that will be thanks enough :-)
Steve
on 30 Sep 2019
Hi Matt,
I could really use your expertise again. I need to figure out how to modify your code in order to find the 10 nearest points to every other point within a group of points (i.e., 10 nearest neighrbors). The points I speak of are the Fermat center points to the Triplets we found in the previous task. I have found all these "Fermat points" and have their coordinates in the attached file (F_points.mat). As always, any help you could offer would be greatly appreciated.
Best
Steve
More Answers (0)
Categories
Find more on Descriptive Statistics in Help Center and File Exchange
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)