14
$\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$
  • 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$ – Dr. belisarius 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$
  • 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$ – Dr. belisarius 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$ – Oleksandr R. 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.