16
$\begingroup$

I have a picture like this

enter image description here

I can get this graph's vertexes

mor = MorphologicalBinarize[img // ColorNegate] // 
     DeleteSmallComponents // ColorNegate // MorphologicalComponents;
selectmor = 
  SelectComponents[
    mor, {"AreaRadiusCoverage", "Count"}, # > 0.78 && #2 < 1000 &] // 
   Image;
mask = Graphics@
  Point@ComponentMeasurements[selectmor, "Centroid"][[All, 2]]

enter image description here

Or get its edges

fillimg = 
  FillingTransform[
     MorphologicalBinarize[img // ColorNegate] // 
        DeleteSmallComponents // Thinning // Pruning, 
     selectmor // Binarize] // Thinning // Pruning;
lines = ImageLines[fillimg, MaxFeatures -> 200, 
   Method -> {"Hough", "Segmented" -> True}];
Graphics[{Thick, Red, Line /@ lines}]

enter image description here

This my current work. May be you can realize it by more smart method. My target is not a Image but a Graph. So how to rebuild the Graph by this vertex and this edge?


Update: After the M.R.'s comments (Thanks for your comment), we can use the MorphologicalGraph to get the embryo of graph.

fillimg // MorphologicalGraph[#, VertexLabels -> "Name"] &

enter image description here

But it have a low precision. So How to refine it?

$\endgroup$
10
  • 1
    $\begingroup$ This has been asked before I believe, check out this answer: mathematica.stackexchange.com/questions/6774/… $\endgroup$
    – M.R.
    Dec 17 '15 at 7:27
  • $\begingroup$ And mathematica.stackexchange.com/questions/8935/… $\endgroup$
    – M.R.
    Dec 17 '15 at 7:28
  • 1
    $\begingroup$ @M.R. Thanks for your MorphologicalGraph in your link.But its precision is very poor when I try to do it.It will introduce many superfluous vertex. $\endgroup$
    – yode
    Dec 17 '15 at 8:19
  • 2
    $\begingroup$ @M.R. After I read all your related links,I think this problem is a essential question still. $\endgroup$
    – yode
    Dec 17 '15 at 8:22
  • $\begingroup$ Updates to questions are a mean for clarifying them, not for scope drifting $\endgroup$ Dec 18 '15 at 13:12
21
$\begingroup$
i       = Binarize@Import["http://i.stack.imgur.com/qofeF.png"];
vertexI = SelectComponents[i, "Count", 10 < # < 100 &];
vxPos   = ComponentMeasurements[vertexI, "Centroid"];
lines   = Subsets[Range@Length@vxPos, {2}];
linePos = lines /. vxPos;
ti@x_  := Total@Flatten@ImageData@Binarize@x

p = Position[ti@i - ti@Show[i, Graphics@Line@#] & /@ linePos, x_ /; x < 100];

Graphics[{Red, Line[Extract[linePos, p]]}]

Mathematica graphics

Graph[Range@Length@vxPos, UndirectedEdge @@@ Extract[lines, p], 
      VertexLabels -> "Name", ImagePadding -> 20, 
      VertexCoordinates -> vxPos]

Mathematica graphics

$\endgroup$
12
  • 5
    $\begingroup$ Congratulations to your doctorate $\endgroup$
    – eldo
    Dec 17 '15 at 14:39
  • 1
    $\begingroup$ @eldo You, you may say. I'm a dreamer, but I'm not the only one :) $\endgroup$ Dec 17 '15 at 14:43
  • $\begingroup$ Bash-wise: Does that mean all Drs are evil dark lords? The helmet fits your avatar perfectly :D $\endgroup$
    – Yves Klett
    Dec 17 '15 at 14:52
  • 3
    $\begingroup$ Getting a Ph.D. made me finally realise how truly useless titles are, and how much unnecessary trouble it causes trying to choose the right one for oneself and others in different situations. Now I never use any at all. $\endgroup$ Dec 17 '15 at 21:27
  • 1
    $\begingroup$ @Oleksandr youtube.com/watch?v=gdi3FIrsHgo $\endgroup$
    – Mr.Wizard
    Dec 22 '15 at 22:26

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.