-
-
Save alexlib/c46cf28ef3cf2efbd6db to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "metadata": { | |
| "name": "SkelAndGraph" | |
| }, | |
| "nbformat": 3, | |
| "nbformat_minor": 0, | |
| "worksheets": [ | |
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": "#The code is a tentative to produce a graph object from an image of morphological skeleton. \nStill not work on some cases" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "import networkx as nx\nfrom PIL import Image, ImageDraw, ImageFont\nfrom skimage import morphology\nimport mahotas as mh\nimport string\nimport itertools", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": "*" | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": "## Making a model image (letter)" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "def makeLetterImage(character, size):\n image = Image.new(\"RGBA\", (720,180), (255,255,255))#600,150\n draw = ImageDraw.Draw(image)\n font = ImageFont.truetype(\"verdana.ttf\", size)\n \n draw.text((5, 0), character, (0,0,0), font=font)\n img_resized = np.array(image.resize((300,75), Image.ANTIALIAS))\n letter = img_resized[0:40,0:30,0]<64\n r1 = mh.bbox(letter)[0]\n r2 = mh.bbox(letter)[1]\n c1 = mh.bbox(letter)[2]\n c2 = mh.bbox(letter)[3]\n letter = letter[r1-1:r2+1,c1-1:c2+1]\n return letter", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 2 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": "## Morphology tool: branched/End-points extraction" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "def branchedPoints(skel, showSE=False):\n X=[]\n #cross X\n X0 = np.array([[0, 1, 0], \n [1, 1, 1], \n [0, 1, 0]])\n X1 = np.array([[1, 0, 1], \n [0, 1, 0], \n [1, 0, 1]])\n X.append(X0)\n X.append(X1)\n #T like\n T=[]\n #T0 contains X0\n T0=np.array([[2, 1, 2], \n [1, 1, 1], \n [2, 2, 2]])\n \n T1=np.array([[1, 2, 1], \n [2, 1, 2],\n [1, 2, 2]]) # contains X1\n \n T2=np.array([[2, 1, 2], \n [1, 1, 2],\n [2, 1, 2]])\n \n T3=np.array([[1, 2, 2],\n [2, 1, 2],\n [1, 2, 1]])\n \n T4=np.array([[2, 2, 2],\n [1, 1, 1],\n [2, 1, 2]])\n \n T5=np.array([[2, 2, 1], \n [2, 1, 2],\n [1, 2, 1]])\n \n T6=np.array([[2, 1, 2],\n [2, 1, 1],\n [2, 1, 2]])\n \n T7=np.array([[1, 2, 1],\n [2, 1, 2],\n [2, 2, 1]])\n T.append(T0)\n T.append(T1)\n T.append(T2)\n T.append(T3)\n T.append(T4)\n T.append(T5)\n T.append(T6)\n T.append(T7)\n #Y like\n Y=[]\n Y0=np.array([[1, 0, 1], \n [0, 1, 0], \n [2, 1, 2]])\n \n Y1=np.array([[0, 1, 0], \n [1, 1, 2], \n [0, 2, 1]])\n \n Y2=np.array([[1, 0, 2], \n [0, 1, 1], \n [1, 0, 2]])\n \n \n Y3=np.array([[0, 2, 1], \n [1, 1, 2], \n [0, 1, 0]])\n \n Y4=np.array([[2, 1, 2], \n [0, 1, 0], \n [1, 0, 1]])\n Y5 = np.rot90(Y3)\n Y6 = np.rot90(Y4)\n Y7 = np.rot90(Y5)\n Y.append(Y0)\n Y.append(Y1)\n Y.append(Y2)\n Y.append(Y3)\n Y.append(Y4)\n Y.append(Y5)\n Y.append(Y6)\n Y.append(Y7)\n \n bp = np.zeros(skel.shape, dtype=int)\n for x in X:\n bp = bp + mh.morph.hitmiss(skel,x)\n for y in Y:\n bp = bp + mh.morph.hitmiss(skel,y)\n for t in T:\n bp = bp + mh.morph.hitmiss(skel,t)\n \n if showSE==True:\n fig = plt.figure(figsize=(4,5))\n tX =['X0','X1']\n tY =['Y'+str(i) for i in range(0,8)]\n tT =['T'+str(i) for i in range(0,8)]\n ti= tX+tY+tT\n SE=X+Y+T\n print len(SE), len(ti)\n n = 1\n ti = iter(ti)\n for se in SE:\n #print next(ti)\n #print se\n mycmap = mpl.colors.ListedColormap(['black','blue','red'])\n ax = fig.add_subplot(4,5,n,frameon=False, xticks=[], yticks=[])\n title(str(next(ti)))\n imshow(se, interpolation='nearest',vmin=0,vmax=2,cmap=mycmap)\n n = n+1\n fig.subplots_adjust(hspace=0.1,wspace=0.08)\n #ax_cb = fig.add_axes([.9,.25,.1,.3])#\n color_vals=[0,1,2]\n #cb = mpl.colorbar.ColorbarBase(ax_cb,cmap=mycmap, ticks=color_vals)\n #cb.set_ticklabels(['back', 'hit', 'don\\'t care'])\n \n plt.show()\n return bp > 0\n\ndef endPoints(skel):\n endpoint1=np.array([[0, 0, 0],\n [0, 1, 0],\n [2, 1, 2]])\n \n endpoint2=np.array([[0, 0, 0],\n [0, 1, 2],\n [0, 2, 1]])\n \n endpoint3=np.array([[0, 0, 2],\n [0, 1, 1],\n [0, 0, 2]])\n \n endpoint4=np.array([[0, 2, 1],\n [0, 1, 2],\n [0, 0, 0]])\n \n endpoint5=np.array([[2, 1, 2],\n [0, 1, 0],\n [0, 0, 0]])\n \n endpoint6=np.array([[1, 2, 0],\n [2, 1, 0],\n [0, 0, 0]])\n \n endpoint7=np.array([[2, 0, 0],\n [1, 1, 0],\n [2, 0, 0]])\n \n endpoint8=np.array([[0, 0, 0],\n [2, 1, 0],\n [1, 2, 0]])\n \n ep1=mh.morph.hitmiss(skel,endpoint1)\n ep2=mh.morph.hitmiss(skel,endpoint2)\n ep3=mh.morph.hitmiss(skel,endpoint3)\n ep4=mh.morph.hitmiss(skel,endpoint4)\n ep5=mh.morph.hitmiss(skel,endpoint5)\n ep6=mh.morph.hitmiss(skel,endpoint6)\n ep7=mh.morph.hitmiss(skel,endpoint7)\n ep8=mh.morph.hitmiss(skel,endpoint8)\n ep = ep1+ep2+ep3+ep4+ep5+ep6+ep7+ep8\n return ep > 0\n\ndef pruning(skeleton, size):\n '''remove iteratively end points \"size\" \n times from the skeleton\n '''\n for i in range(0, size):\n endpoints = endPoints(skeleton)\n endpoints = np.logical_not(endpoints)\n skeleton = np.logical_and(skeleton,endpoints)\n return skeleton", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 54 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "def edges_from_C8skel(c8skeleton):\n '''given a skeleton defined on c8 neighborhood (use mahotas),\n \\ returns labeled edges\n '''\n branchedP = branchedPoints(c8skeleton, showSE = False) > 0\n endP = endPoints(c8skeleton) > 0\n edges = np.logical_not(branchedP)*c8skeleton\n label_edges,ne = mh.label(edges)\n return label_edges", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 5 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "def labels_in_labeledImage(labImage):\n return np.where(mh.histogram.fullhistogram(np.uint16(labImage))[:]>0)[0][1:]", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 6 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "def SkeletonDecomposition(skeletonC8):#images processing: extraction of branchedpoints, end-points, edges\n ep = endPoints(skeletonC8)\n bp = branchedPoints(skeletonC8, showSE = False)\n ## Label branched-points\n l_bp,_ = mh.label(bp)\n #mh.labeled.relabel(l_bp, inplace=True)\n ## Label the edges\n l_edges = edges_from_C8skel(skeletonC8)\n ##Make end-points with the same label than their edge\n l_ep = ep*l_edges \n #mh.labeled.relabel(l_ep, inplace=True)\n ##edges between branched-points\n endpoints_labels = np.where(mh.histogram.fullhistogram(np.uint16(l_ep))[:]==1)[0]\n edges_bp = np.copy(l_edges)\n for l in endpoints_labels:\n edges_bp[np.where(edges_bp == l)]=0\n mh.labeled.relabel(edges_bp, inplace=True)\n #edges between end-points and branched points\n edges_ep_to_bp = l_edges * np.logical_not(edges_bp > 0)\n mh.labeled.relabel(edges_ep_to_bp, inplace=True)\n Ep_Bp, _ = mh.labeled.relabel(edges_ep_to_bp)\n Bp_Bp, _ = mh.labeled.relabel(edges_bp)\n Bp, _ = mh.labeled.relabel(l_bp,inplace=True)\n Ep, _ = mh.labeled.relabel(l_ep,inplace=True)\n return Ep_Bp, Bp_Bp , Bp, Ep ", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 7 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "def labels_in_the_neighbourhood(label, domainimage, edgesImage):\n '''\n gives the values of the labels (edgesImages) in the neighbourhood of a domain of label=l in domainimage.\n label (int) label value of the domain in domainimage.\n domainimage : array of domains (typically branched points of a skeleton of one pixel or more) of label l.\n edgesImage : array of labelled edges defining neighbourhood of domains.\n '''\n se = np.zeros((3,3))\n se[:,:]=1\n nei = mh.dilate(domainimage==label, Bc=se)\n nei = np.logical_not(domainimage==1)*nei\n edges_label = mh.histogram.fullhistogram(np.uint16(edgesImage[nei>0])) #np.where()\n return np.where(edges_label>0)[0][1:]", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 8 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": "### This function generate a dict of the form {label domain:[lab of edge1,lab of edge2], lab dom2:[lab edge, lab edge]}" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "#Now try to link thedifferent kind of domain (ep or bp)\n## we need to know the labels in the neighbourhood of a domain\ndef neighbourhood_of_domain(domainIm, targetIm):\n neighbourhood_of_domain_in_targetIm = {}\n ##Labels of bp domains\n #since labels were relabeled to 1:n, it would be possible to use\n #domains_labels = np.arange(1,domainIm.max())\n domains_labels = np.where(mh.histogram.fullhistogram(np.uint16(domainIm))[:]>0)[0][1:]#tricky, another way?\n for lab in domains_labels:\n neighbourhood_of_domain_in_targetIm[lab]=labels_in_the_neighbourhood(lab, domainIm, targetIm)#.tolist()\n return neighbourhood_of_domain_in_targetIm", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 9 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": "### function to invert the previous dict: {lab edge1:[lab domain1,lab dom2], lab edge2:[lab dom, lab dom]...}" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "def inverse_dict_non_unique_mappings(domNeighbourhood_dict):\n edges_dict = {item: [key for key in domNeighbourhood_dict if item in domNeighbourhood_dict[key]] for value in domNeighbourhood_dict.values() for item in value}\n return edges_dict", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 10 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": "## Basic tools : convert branched point image or ep image to graph vertices" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "def add_bp_to_graph(Graph, Bp):\n labels_BP = labels_in_labeledImage(Bp)\n #print labels_BP\n #add_bp_to_graph(Graph, labels_BP)\n nodesN = Graph.order()\n translate_Bplabel_to_Node_index={}\n for lab in labels_BP:\n pos = np.where(Bp == lab)\n #print pos\n translate_Bplabel_to_Node_index[lab] = nodesN+lab\n Graph.add_node(nodesN+lab,kind=\"BP\",label=lab, position=pos)\n return translate_Bplabel_to_Node_index", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 11 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "def add_ep_to_graph(Graph, Ep):\n '''Adds end-points from labelled Ep image to a graph and\n returns a dictionnary mapping Ep labels into Node index (necessary when adding edges into the graph)\n '''\n translate_Eplabel_to_Node_index={}\n labels_EP = labels_in_labeledImage(Ep)\n #print labels_EP\n nodesN = Graph.order()\n for lab in labels_EP:\n pos = np.where(Ep == lab)\n #print pos\n translate_Eplabel_to_Node_index[lab] = nodesN+lab\n Graph.add_node(nodesN+lab,kind=\"EP\",label=lab, position=pos)\n return translate_Eplabel_to_Node_index\n", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 12 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": "# Make an image of the letter: a" | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": "## Let's compare first the skeletons computed with scikit-image or mahotas." | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "se8 = np.array([[True,True,True],\n [True,True,True],\n [True,True,True]])\n\nse4 = np.array([[False,True,False],\n [True,True,True],\n [False,True,False]]) \n\nimK = makeLetterImage('a', 80)\nskel0 = morphology.medial_axis(imK,mask=se8) \nskel1= morphology.medial_axis(imK,mask=se4)\nskel2 = morphology.skeletonize(imK)\nskel = mh.thin(imK)\n\nEp_Bp, Bp_Bp, Bp, Ep = SkeletonDecomposition(skel)\nBP1 = branchedPoints(skel1)\nBP2 = branchedPoints(skel2)\n", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": "*" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "figsize(8,5)\nsubplot(241,xticks=[],yticks=[])\ntitle('mahotas thin')\nimshow(skel+1*imK, interpolation='nearest')\nsubplot(242,xticks=[],yticks=[])\ntitle('skimage medial axis se8')\nimshow(skel0+1*imK, interpolation='nearest')\nsubplot(243,xticks=[],yticks=[])\ntitle('skimage medial axis se4')\nimshow(skel1+1*imK, interpolation='nearest')\nsubplot(244,xticks=[],yticks=[])\ntitle('skimage skeletonize')\nimshow(skel2+1*imK, interpolation='nearest')\nsubplot(245,xticks=[],yticks=[])\ntitle('maho thin()+branched-points')\nimshow(skel+1*Bp, interpolation='nearest')\nsubplot(246,xticks=[],yticks=[])\ntitle('sk medial axis+branched-points')\nimshow(skel1+1*BP1, interpolation='nearest')\nsubplot(248,xticks=[],yticks=[])\ntitle('skeletonize+branched-points')\nimshow(skel2+1*BP2, interpolation='nearest')", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": "*" | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": "### Decompose the skeleton of the letter a" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "figsize(15,20)\nsubplot(151,xticks=[],yticks=[])\nimshow(skel, interpolation='nearest')\nsubplot(154,xticks=[],yticks=[])\nimshow(Ep_Bp, interpolation='nearest')\ntitle('Lab='+str(labels_in_labeledImage(Ep_Bp)))\nsubplot(155,xticks=[],yticks=[])\ntitle('Lab='+str(labels_in_labeledImage(Bp_Bp)))\nimshow(Bp_Bp, interpolation='nearest')\nsubplot(153,xticks=[],yticks=[])\ntitle('Lab='+str(labels_in_labeledImage(Ep)))\nimshow(Ep, interpolation='nearest')\nsubplot(152,xticks=[],yticks=[])\ntitle('Lab='+str(labels_in_labeledImage(Bp)))\nimshow(Bp, interpolation='nearest')", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 64, | |
| "text": "<matplotlib.image.AxesImage at 0xac8da1ec>" | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\n/gEylr24MqAdygAAAABJRU5ErkJggg==\n", | |
| "text": "<matplotlib.figure.Figure at 0xad0171ac>" | |
| } | |
| ], | |
| "prompt_number": 64 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": "### labels of edges between endpoints and branched-points (Ep_Bp)" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "figsize(10,20)\nsubplot(151,xticks=[],yticks=[])\ntitle('1')\nimshow(Bp_Bp==1, interpolation='nearest')\nsubplot(152,xticks=[],yticks=[])\ntitle('2')\nimshow(Bp_Bp==2, interpolation='nearest')\nsubplot(153,xticks=[],yticks=[])\ntitle('3')\nimshow(Bp_Bp==3, interpolation='nearest')\nsubplot(154,xticks=[],yticks=[])\ntitle('4')\nimshow(Bp_Bp==4, interpolation='nearest')\nsubplot(155,xticks=[],yticks=[])\ntitle('5')\nimshow(Bp_Bp==5, interpolation='nearest')", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 65, | |
| "text": "<matplotlib.image.AxesImage at 0xac78edec>" | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\n36ByAAAAAElFTkSuQmCC\n", | |
| "text": "<matplotlib.figure.Figure at 0xacfb97ec>" | |
| } | |
| ], | |
| "prompt_number": 65 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": "### Check neighbourhood of bp in Bp_Bp edges" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "ND_Bp_in_BPBP = neighbourhood_of_domain(Bp,Bp_Bp)\nND_Bp_in_EPBP = neighbourhood_of_domain(Bp,Ep_Bp)\nND_Ep_in_EPBP = neighbourhood_of_domain(Ep,Ep_Bp)\n\nprint ND_Bp_in_BPBP\nprint ND_Bp_in_EPBP\nprint ND_Ep_in_EPBP\n\nfor bp in ND_Bp_in_EPBP.keys():\n for edge in itertools.product([bp],ND_Bp_in_EPBP[bp]):\n print 'edge', edge", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": "{1: array([1, 2]), 2: array([1, 2])}\n{1: array([1]), 2: array([2])}\n{1: array([1]), 2: array([2])}\nedge (1, 1)\nedge (2, 2)\n" | |
| } | |
| ], | |
| "prompt_number": 66 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "print inverse_dict_non_unique_mappings(ND_Bp_in_BPBP)\nprint inverse_dict_non_unique_mappings(ND_Bp_in_EPBP)\nprint inverse_dict_non_unique_mappings(ND_Ep_in_EPBP)", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": "{1: [1, 2], 2: [2, 3], 3: [2, 3]}\n{1: [1], 2: [1], 3: [3]}\n{2: [2], 3: [3]}\n" | |
| } | |
| ], | |
| "prompt_number": 166 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "def C8_Skeleton_To_Graph_01(Graph, C8Skeleton):\n Ep_Bp, Bp_Bp, Bp, Ep = SkeletonDecomposition(C8Skeleton)\n \n #print Graph.order()\n ## try to add branched points first: check if they exist\n if Bp.max()>0:# At least one bp\n map_Bp_nodes = add_bp_to_graph(Graph, Bp)#map label of Bp-image into node index\n # ex:\n # map Bp |-> node {1: 1, 2: 2, 3: 3} the labels in the image are equal to th nodes index in the graph\n map_Ep_nodes = add_ep_to_graph(Graph, Ep)\n #ex:\n # map Ep |-> node {1: 4, 2: 5, 3: 6, 4: 7, 5: 8} : the endpoint of label 1 (image) is the node of index 4 in the graph\n \n print 'map Bp |-> node',map_Bp_nodes\n print 'map Ep |-> node',map_Ep_nodes\n \n # link End-points and Branched-points\n #Search label(s) of edges in image containing edges between ep and bp\n ## first get the neighborhood of all branched domains (one or more pixels) in Ep_Bp image\n \n ND_Bp_in_EPBP = neighbourhood_of_domain(Bp,Ep_Bp)\n ND_Ep_in_EPBP = neighbourhood_of_domain(Ep,Ep_Bp)\n print ND_Bp_in_EPBP\n print 'inv:',inverse_dict_non_unique_mappings(ND_Bp_in_EPBP)\n #Neighbourhood Domain 1 (label=1 in Bp image) has two neighbors of label 1 or 2 in image of edges linking Ep to Bp\n # {1: array([1, 2]), 2: array([3, 4]), 3: array([5])}\n #Inverting the dict yields:\n # {1: [1], 2: [1], 3: [2], 4: [2], 5: [3]}\n # edge of label 1 (in Ep_Bp) is close to Branched-point of lab=1 in Bp, edge of lab=2 is close to branched point of lab=1\n \n print ND_Ep_in_EPBP\n print 'inv',inverse_dict_non_unique_mappings(ND_Ep_in_EPBP)\n \n map_edges_to_bp = inverse_dict_non_unique_mappings(ND_Bp_in_EPBP)\n map_edges_to_ep = inverse_dict_non_unique_mappings(ND_Ep_in_EPBP)\n #\n ### link Bp to Ep\n # get a bp \n for bp in ND_Bp_in_EPBP.keys():\n #search edges lab in bp neighbourhood in EPBP edges\n for ep in ND_Bp_in_EPBP[bp]:\n vertexbp = map_Bp_nodes[bp]# should be here id to bp\n vertexep = map_Ep_nodes[ep]\n w = np.sum(Ep_Bp==ep) # edge weight\n print ep, vertexbp, vertexep\n Graph.add_edge(vertexbp,vertexep,weight=w)\n #\n # try to link branched-points between them\n ## get the neighbourhood of branched points in image of edges between bp \n ND_Bp_in_BPBP = neighbourhood_of_domain(Bp,Bp_Bp)\n map_edges_to_bp_in_Bp = inverse_dict_non_unique_mappings(ND_Bp_in_BPBP)\n \n #### This loop links branched points between them\n print 'LINKING BP to BP'# TODO FIX IT this yield a wrong graph !!\n print 'inv EDGES : BP',inverse_dict_non_unique_mappings(ND_Bp_in_BPBP)\n for edge in map_edges_to_bp_in_Bp.keys():\n current_bp1 = map_edges_to_bp_in_Bp[edge][0]\n current_bp2 = map_edges_to_bp_in_Bp[edge][1]\n vertex1 = map_Bp_nodes[current_bp1]\n vertex2 = map_Bp_nodes[current_bp2]\n w = np.sum(Bp_Bp==edge)\n print edge, map_edges_to_bp_in_Bp[edge], current_bp1, current_bp2, w\n Graph.add_edge(vertex1,vertex2,weight=w)\n \n if Bp.max()==0 and Ep.max()>0:\n # add Ep first\n pass", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 67 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": "## try the function skeleton ---> graph" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "Graph = nx.MultiGraph()\nC8_Skeleton_To_Graph_01(Graph, skel)\nprint Graph.edges(data=True)", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": "map Bp |-> node {1: 1, 2: 2}\nmap Ep |-> node {1: 3, 2: 4}\n{1: array([1]), 2: array([2])}\ninv: {1: [1], 2: [2]}\n{1: array([1]), 2: array([2])}\ninv {1: [1], 2: [2]}\n1 1 3\n2 2 4\nLINKING BP to BP\ninv EDGES : BP {1: [1, 2], 2: [1, 2]}\n1 [1, 2] 1 2 35\n2 [1, 2] 1 2 7\n[(1, 2, {'weight': 35}), (1, 2, {'weight': 7}), (1, 3, {'weight': 20}), (2, 4, {'weight': 2})]\n" | |
| } | |
| ], | |
| "prompt_number": 68 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "figsize(8,8)\nsubplot(121)\nimshow(skel,interpolation='nearest')\nsubplot(122)\n#nx.draw_graphviz(Graph, prog='neato')\nnx.write_dot(Graph,'multi.dot')\n!neato -T png multi.dot > multi.png\nimshow(mh.imread('multi.png'), interpolation='nearest')", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 69, | |
| "text": "<matplotlib.image.AxesImage at 0xac7696cc>" | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\nwFSupAAAAABJRU5ErkJggg==\n", | |
| "text": "<matplotlib.figure.Figure at 0xac7f1d8c>" | |
| } | |
| ], | |
| "prompt_number": 69 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "print g.edges(data=True)", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": "[('A', 'B', {'weight': 4}), ('A', 'B', {'weight': 3})]\n" | |
| } | |
| ], | |
| "prompt_number": 205 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": "## More checking" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "imTest = makeLetterImage('w', 70)\nskelTest = mh.thin(imTest)\nEp_Bp, Bp_Bp, Bp, Ep = SkeletonDecomposition(skelTest)\n\nGraphTest = nx.Graph()\nC8_Skeleton_To_Graph_01(GraphTest, skelTest)", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": "map Bp |-> node {1: 1, 2: 2, 3: 3}\nmap Ep |-> node {1: 4, 2: 5, 3: 6, 4: 7, 5: 8}\n{1: array([2]), 2: array([1, 5]), 3: array([3, 4])}\ninv: {1: [2], 2: [1], 3: [3], 4: [3], 5: [2]}\n{1: array([1]), 2: array([2]), 3: array([3]), 4: array([5]), 5: array([4])}\ninv {1: [1], 2: [2], 3: [3], 4: [5], 5: [4]}\n2 1 5\n1 2 4\n5 2 8\n3 3 6\n4 3 7\nLINKING BP to BP\ninv EDGES : BP {1: [1, 2], 2: [1, 3]}\n1 [1, 2] 1 2 12\n2 [1, 3] 1 3 13\n" | |
| } | |
| ], | |
| "prompt_number": 76 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "figsize(20,15)\nsubplot(161,xticks=[],yticks=[])\nimshow(2*imTest+1.0*skelTest, interpolation='nearest')\nsubplot(162,xticks=[],yticks=[])\nnx.draw(GraphTest)\nsubplot(163,xticks=[],yticks=[])\nimshow(Ep_Bp, interpolation='nearest')\ntitle('Lab='+str(labels_in_labeledImage(Ep_Bp)))\nsubplot(166,xticks=[],yticks=[])\ntitle('Lab='+str(labels_in_labeledImage(Bp_Bp)))\nimshow(Bp_Bp, interpolation='nearest')\nsubplot(165,xticks=[],yticks=[])\ntitle('Lab='+str(labels_in_labeledImage(Ep)))\nimshow(Ep, interpolation='nearest')\nsubplot(164,xticks=[],yticks=[])\ntitle('Lab='+str(labels_in_labeledImage(Bp)))\nimshow(Bp, interpolation='nearest')", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 77, | |
| "text": "<matplotlib.image.AxesImage at 0xa8c8e14c>" | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "iVBORw0KGgoAAAANSUhEUgAABGoAAANTCAYAAAD2ZfvtAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XuYXXV9L/73ntxmJpPgCCRAuIMKValE5X4JoIBcBI8t\nRwWFymnl5o2eevm1FThSTwU8etRStXoUilX42epPQbSCogkicrVFg6JCIhFIAonJZEhmJrN+fyRw\nQpiZzG3vtS+v1/PsBzJr7dmfPc9aK7Pf+azvp1IURREAAAAAStdWdgEAAAAAbCKoAQAAAKgTghoA\nAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgT\nghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAA\nAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGo\nAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACA\nOiGoAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgTghoA\nAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgT\nghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAA\nAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGo\nAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACAOiGoAQAAAKgTghoAAACAOjG17AIAGt26devyla98\nJbfdeGNWrVyZqdOmZe6uu+aMs8/Osccem7Y2mTgAADA6laIoirKLAGhEv/vd7/Kxj3wk/3zttTmi\nrS1v6OnJ9kkGkixJ8sWurjw9a1bO/8u/zAUXXZQZM2aUXDEAAFDvBDUA43D33XfntNe+Nm/p6clF\nAwPZY4h9iiR3JPlwR0eefulL8/V///d0d3fXuFIAAKCRCGoAxuiBBx7IsYcems/19OT0Uey/Mcl7\n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\nyy25sKsr5198cS585zvT3t6+ze85ffr0dEyblhUbNmTr5Yh/mOSRJLtv/nNPko1JFie5e4v9iiSP\nDQxk++23n+A7BAAAmomOGqBp3XPPPTn4gAMy7QtfyL29vfn/enpyTpJTkpye5N1J7u3pyXWPP57v\nX3JJjj/88FHdirR+/frMP+CA/PMQ2/4iyW+T/CybumvOS3Jyku9utd+Pk0ybPTsveclLxv3+GNqC\nBQvyhS98YULf47bbbktbW1tmz56df//3f5+kyurTOeeck87Ozuy2225ll0INNeN54lhuXc14PFeT\nc4WtNcI59Ktf/SpdXV2ZOnXqhGttBIIaoCn9/Oc/z+sWLMinV63Klf392WOY/SpJDknyraefzvwH\nHsjrjjoqvb29z9uvKIr85Cc/yXnnnZd58+bl6Uol/zBjRra+aaojyZzNj7lJujZ/beu+mas7O3P+\nX/5l2tpchoez55575tZbbx3z8yqVyqTcUjZv3rysWbMmxx9/fJLk8ccfz+tf//rMmzcvbW1tWbp0\n6bDP7evry7nnnps999wzs2fPzoEHHpjvfOc7w+7/gx/8IAcccEC6u7vzwhe+MMcff3x+8YtfbLPG\nhx56KO3t7XnrW9867D7P/OI0a9asZx///M//N2b80pe+lJtvvnmbr0V9cp783/PEsdz4HM+u+0xM\nM59DL37xi9PT05MjjzyyJZYO8AkBaDoDAwM5/fjjc9W6dXnDFl/vS3Jukj2TzE5yYJJnLv9tST7e\n15eX/OY3ufj88599zrJly/L3f//32X///XP22Wdnjz32yM9+9rP85Cc/yexdd83Xt1HLJUmu3epr\nv0ly0+Bgznn728f/JlvAZP3SMFna2tpy0kkn5V//9V+3ue/AwEB23333/OhHP8qaNWty+eWX54wz\nzsiSJUuG3P+lL31pbr755qxatSpPPPFEDjzwwLx9FMfHhRdemIMOOmibP6d58+Zl7dq1zz62/gW/\nKEZaTYl65jx57nniWG5sjmfXfSamlc6hZieoAZrOTTfdlB3Wrs3btvolZCCb1o75UTaN0L48yRlJ\nnrn8V5J8bP36XH/DDfn85z+fE088MS9/+cvz8MMP54tf/GIefPDBfPCDH8yuu+6aSqWSq6+9Nud3\nduaeMdS2IslJnZ35yBVXpLt7uLlRjGT16tU55ZRTMmfOnLzwhS/MqaeemmXLlj1nn1//+tc5+OCD\ns9122+X000/PqlWrJvy6c+bMyXnnnZdXvepV29y3s7Mzl1xySXbffdNqRSeffHL22muv3HvvvcN+\n73nz5iVJBgcH09bWlp133nnE1/jqV7+a7u7uHHfccX7h5nmcJzQTx/MmrvuMVzOeQ81OUAM0nauv\nuCIXrF37vK93ZlOHyzML/Z6cZK8kW17+d0xy7Pr1uerKK3P22Wdn2bJl+exnP5tDDz30ef9Ccdhh\nh+Vz112X13V25lsZecJTkjyQ5LDOzrzlPe/JBe985/jeHBkcHMy5556bpUuXZunSpeno6MhFF130\n7PaiKHLttdfmi1/8Yh577LFMnTo173rXu57d/oIXvCDd3d1DPq644oqq1PzEE0/kV7/6VV760pcO\nu8/SpUvT3d2dzs7O3HTTTSPef71mzZpccskl+fjHPz6qX9aXL1+enXbaKXvvvXcuvvjiIW/vo7k4\nT2gmjmfXfSamWc+hplYANJGlS5cW27e3F08nRbGNx+NJ0Z4Uv9zq67cnxf677Tbq1/zRj35UvHje\nvOKArq7iM0mxdovv1Z8UX0+K13Z1FXNmzSq+8E//VMV331z23HPP4tZbb93mfvfdd1/R3d397J8X\nLFhQfPCDH3z2z7/4xS+K6dOnF4ODg6N+7R/84AfFrrvuOuS2/v7+olKpFEuWLBnV9+rr6yuOO+64\n4rzzzhvV/k899VRx1llnFa9//euH3edd73pXccUVVxRFURSXXnppcdZZZw277+OPP14sXry4KIqi\nePjhh4ujjjqqeMc73vGcfUZ6v9Q358lzzxPHcmNzPLvuMzGtcA4tWLCg+MIXvjDquhqV8dxAU3nk\nkUfykhkz0r5+/Yj79Sc5M8k5SV681bY/TvLwY4+N+jWPPPLILF66NN///vdz9RVX5N0/+EFmTZ2a\nKZVKVvX15ZX7758LP/CB/Mmf/ElmzJgxtjfE8/T29ua9731vvvvd7z7bltvT05OiKJ7tetpyksXu\nu++e/v7+rFy5MjvuuGNNax0cHMxb3/rWtLe359Of/vSontPd3Z2rrroqO++8c9asWZPZs2c/Z/v9\n99+fW2+9Nffdd1+Sba8zMHfu3MydOzfJpkUGr7jiipxyyin5zGc+M453RKNo9fOE5tLqx7PrPhPV\n7OdQMxLUAE1l3bp1mbmNfQaTvDVJe5KhLv+dSTYMDGTjxo2ZMmXKqF63ra0tr3nNa/Ka17wmfX19\nWb16dQYGBtLd3Z2Ojo4xvQdG9rGPfSy/+tWv8tOf/jRz5szJ/fffn/nz5z/nl40tpwosXbo006ZN\nyw477JAk6erqGnahvb/+67/OBz7wgUmpsyiKnHvuuVmxYkW+/e1vj/pYSpL+/v60tbUNGez98Ic/\nzCOPPPLsPdw9PT3ZuHFjFi9enLvvvntU339wcOt5ZTSbVj9PaC6tfjy77jNRrXAONRtBDdBUZs+e\nneevTvN/Fdk0+WlFkm8nGery35Okc/r0cf/lMH369MyZM2dcz+W5+vr6sn6L7qipU6emp6cnHR0d\n2W677fLUU0/lsssue85ziqLIddddl7e97W3ZY4898qEPfSh/+qd/+uwvGD09PeOuZ/369RkYGHj2\n/9evX5/29vYh9z3//PPz4IMP5pZbbtnmB8mvf/3reelLX5p99903Tz75ZC6++OKcdNJJQz7vL/7i\nL/LmN7/52fd61VVX5ZFHHhn2X0pvu+227LXXXtl9993z6KOP5v3vf39OP/30sbxt6pzzRFDTTBzP\nrvtMTKucQ83OYsJAU9l3333z4Pr1+cMw289P8mCSbyYZ7vJ/e5L999qrGuUxRieddFI6OzufffyP\n//E/8p73vCdPP/10dthhhxx22GF53ete95x/5alUKnnb296Wc845JzvvvHP6+vryyU9+clLq6ezs\nzOzZs1OpVLLffvtl5syh+7eWLFmSz33uc/nZz36WnXbaKbNmzcqsWbPyla98Zcj9ly1blhNPPDGz\nZ8/O/Pnz093dnWuuuWbIfTs6OjJnzpzMmTMnc+fOTVdXVzo6OrL99tsPuf99992Xww8/PF1dXTn8\n8MPzile8YtJ+HtQH5wnNxPH8fK77jEWzn0PbuvWvWVSKVnmnQMs44+STc9TNN+eirS5vS7JpylN7\nnttJ87kkb97iz6/v6sppn/hEzj333KrXSn1auHBhTjjhhLS3t+f666/Pa1/72rJLqppzzz03X/va\n1zJ37tz86le/KrscGki9nSeOZSai3o7nanKuUA3VPoceeuihvPrVr87AwECuvvrqvO1tb5vU719v\nBDVA07nttttywamn5uc9PRn6btrhLUkyv7Mzv1uxIp2dndUoDwAAYFhufQKaztFHH53Ze+6Zj0wd\n2zJcfUnO7ezMhRddJKQBAABKoaMGaEqPPfZYDnvFK3LRk0/m4o0bt9lZ05vkzI6OFEcckX+9+eaW\n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\nv0eOUAMAALA7oQZq4IILLsj1118/ZT/v0UcfzVve8pZ84AMfyMc+9rFX9BpCDQAAwO6EGqiB8847\nL7fddls2bdrU8p/18MMPZ/Hixbn88stzxRVXvOLXEWoAAAB2J9RADcyePTunnnpqbrnllpb+nAcf\nfDCLFy/Ohz/84XzoQx86oNcSagAAAHYn1EBNtPrTn+67774sXrw4V155ZT74wQ8e8OsJNQAAALsT\naqAmzjrrrKxYsSKPP/74pL/2vffem7e+9a256qqrcumll07Kawo1AAAAuxNqoCb6+vqyZMmS3HDD\nDZP6uqtWrcrpp5+eT37yk7n44osn7XVfCDXNZnPSXhMAAKDqhBqokcn+9Kd/+7d/y2/91m/ls5/9\nbC666KJJe90kmTZtWjo7OzM6OjqprwsAAFBlQg3UyFvf+tasWbMmq1evPuDXWrlyZd72trflc5/7\nXN773vdOwrrdOf4EAACwM6EGaqSzszPnn3/+AT9Vs2LFirzjHe/INddck3PPPXeS1u1OqAEAANiZ\nUAM1c+GFF+b6669/xe/9smzZspx55pn54he/mLPPPnuS1+1MqAEAANiZUAM1c8IJJ6SnpyfDw8P7\n/b133HFHlixZkuuuuy5nnnlmC9btbGBgQKgBAADYgVADNdNoNHLhhRfmq1/96n593/e///2cc845\n+fu///u8/e1vb9G6nXmiBgAAYGddRQ8AJt/555+fBQsW5Jf33ZfV996bTaOj6Z8+PUf/2q/l9z70\noZx55pnp6nrx1/873/lOLrjggtx4441ZvHjxlO0cHBzMyMjIlP08AACAsvNEDdRIs9nMtddck7ed\nckrmbN6cM7773fzPNWvyLxs25Ou//GXe/cMf5i8uuiivPfTQfPZTn8rExERuv/32XHDBBbn55pun\nNNIknqgBAADYlSdqoCbGx8dz2cUXZ8VNN+Wro6NZmKSxyz3HJnnfpk35P0n+6M/+LLd+/eu59+GH\nc+utt+ZNb3rTlG8eHBzML37xiyn/uQAAAGXliRqogWazmQ9ffnlW33RTfjg6mkXZPdLsaH6S74yO\nZvpdd+Wk447LwoULp2jpzjxRAwAAsDOhBmpg6dKluf2rX80to6OZucu1C5McluSgJK9L8ufPf703\nyS1J1t55Z66//vqpG7sDoQYAAGBnQg3UwN986lP5z888k4E9XLsyyUNJnk5ye5K/TvKt569NT/Lx\n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\nM2fmPwwM5P2f+ESu/cpX0tHh1+1ACTUAAEDdNZrN5r6e4AB2sW7dunzpi1/Ml/7mb/LY2rUZHRvL\nrGnTMv/YY/MHV1yRJUuWpLu7u+iZtfH0009n7ty52bx5c9FTAAAAWkKoASqj2Wymu7s7W7ZsEcAA\nAIBachYDqIxGo+EjugEAgFoTaoBK8T41AABAnQk1QKUINQAAQJ0JNUClCDUAAECdCTVApQg1AABA\nnQk1QKUINQAAQJ0JNUClCDUAAECdCTVApQg1AABAnQk1QKUINQAAQJ0JNUClCDUAAECdCTVApQg1\nAABAnQk1QKUINQAAQJ0JNUClCDUAAECdCTVApQwMDAg1AABAbTWazWaz6BEA+2piYiLd3d3ZunVr\nuru7i54DAAAwqTxRA1RKR0dHZs2alY0bNxY9BQAAYNIJNUDleJ8aAACgroQaoHKEGgAAoK6EGqBy\nhBoAAKCuhBqgcoQaAACgroQaoHKEGgAAoK6EGqByhBoAAKCuhBqgcoQaAACgroQaoHKEGgAAoK6E\nGqByhBoAAKCuhBqgcoQaAACgroQaoHKEGgAAoK6EGqByhBoAAKCuhBqgcoQaAACgrhrNZrNZ9AiA\n/TExMZHu7u4899xz6ezsLHoOAADApPFEDVA5HR0dOeiggzIyMlL0FAAAgEkl1ACV5PgTAABQR0IN\nUElCDQAAUEdCDVBJQg0AAFBHQg1QSQMDA0INAABQO0INUEmeqAEAAOpIqAEqaXBw0Kc+AQAAtSPU\nAJXkiRoAAKCOhBqgkoQaAACgjoQaoJKEGgAAoI6EGqCShBoAAKCOhBqgkoQaAACgjoQaoJKEGgAA\noI6EGqCShBoAAKCOGs1ms1n0CID9NT4+np6enoyNjaWjQ3MGAADqwV83QCV1dnamv78/GzduLHoK\nAADApBFqgMpy/AkAAKgboQaoLKEGAACoG6EGqCyhBgAAqBuhBqgsoQYAAKgboQaoLKEGAACoG6EG\nqCyhBgAAqBuhBqgsoQYAAKibRrPZbBY9AmBfbdu2Ld/4xjdyzWc+kxUrV2bz2Fhm9Pbm1UNDef9l\nl+UDl1yS2bNnFz0TAADgFRFqgEpoNpu55q//Ov/9qqty1NhYLtu0KacnmZVkS5J7k1w7fXr+V7OZ\ns5csyf+49trMmjWr2NEAAAD7SagBSq/ZbOYPf//3c8fXvpbrRkdz/Evcuy7Jf+npyY+POCLf/pd/\nyWGHHTZVMwEAAA6YUAOU3kc/8pF8/5pr8u3R0Ry0D/c3k3yiqyu3vPa1+eHdd2fmzJmtnggAADAp\nvJkwUGorV67MV66+OrfuIdIsTjI9yczn/73h+a83knx827b8u0cfzSevumrqxgIAABwgT9QApfZ7\nF1yQo2+4IVdOTOx27bQk70ty8V6+9/4kp8ycmUeffDK9vb0tXAkAADA5PFEDlNaGDRvy9ZtvziV7\niDQveKnSfEyS+c1mbrrppknfBgAA0ApCDVBa3/zmN3NaV1eGXuKeK5MckuSUJD/Yw/UPbN6cG77w\nhZbsAwAAmGxCDVBaTzzxRF777LN7vf7pJA8l+WWS/5TkrCS/2OWeo5KsfeKJFi0EAACYXEINUFpj\nY2PpfoljTycnmZGkO8lFSd6c5LZd7ulO8txzz7VqIgAAwKQSaoDSGhwczFM9PQf0Guuefx0AAIAq\nEGqA0jr11FPzT0n29DzMxiTfTrI1ybYk1ye5I8nbd7nvlt7e/Pt3vKOlOwEAACaLj+cGSm3xiSfm\nspUrc94uX38qyRlJfp6kM8kbkvxZktN3uOfpJEdNm5ZVDz6YuXPnTsleAACAA+GJGqDULrviinyu\nv3+3j+GenWRFtseYDUl+nJ0jTZJ8Ocnpp50m0gAAAJXhiRqg1MbGxnLqggU5ffXq/PnY2D5/33CS\ns/r68r+XLcu8efNaNxAAAGASeaIGKLXu7u5843vfy9fnzMmf9PRk758B9aLvJHlnX1++cuONIg0A\nAFApQg1Qeoccckh+9K//mjuPPz7HzpiRv2o0MrLLPeNJvpnkjP7+XHjQQbnp9ttzxhlnFLAWAADg\nlXP0CaiMZrOZH/3oR7n6L/4ity9dmnm9vZnVbGZLo5HVY2OZc+SRueyKK/Lud78706dPL3ouAADA\nfhNqgEpau3Zt7rnnnoyMjKSvry9HHHFEjj322KJnAQAAHBChBgAAAKAkvEcNAAAAQEkINQAAAAAl\nIdQAAAAAlIRQAwAAAFASQg0AAABASQg1AAAAACUh1AAAAACUhFADAAAAUBJCDQAAAEBJCDUAAAAA\nJSHUAAAAAJSEUAMAAABQEkINAAAAQEkINQAAAAAlIdQAAAAAlIRQAwAAAFASQg0AAABASQg1AAAA\nACUh1AAAAACUhFADAAAAUBJCDQAAAEBJCDUAAAAAJSHUAAAAAJSEUAMAAABQEkINAAAAQEkINQAA\nAAAlIdQAAAAAlIRQAwAAAFASQg0AAABASQg1AAAAACUh1AAAAACUhFADAAAAUBJCDQAAAEBJCDUA\nAAAAJSHUAAAAAJSEUAMAAABQEkINAAAAQEkINQAAAAAlIdQAAAAAlIRQAwAAAFASQg0AAABASQg1\nAAAAACUh1AAAAACUhFADAAAAUBJCDQAAAEBJCDUAAAAAJSHUAAAAAJSEUAMAAABQEkINAAAAQEkI\nNQAAAAAlIdQAAAAAlIRQAwAAAFASQg0AAABASQg1AAAAACUh1AAAAACUhFADAAAAUBJCDQAAAEBJ\nCDUAAAAAJSHUAAAAAJSEUAMAAABQEkINAAAAQEkINQAAAAAlIdQAAAAAlIRQAwAAAFASQg0AAABA\nSQg1AAAAACUh1AAAAACUhFADAAAAUBJCDQAAAEBJ/D9Tw2IK0f7uzwAAAABJRU5ErkJggg==\n", | |
| "text": "<matplotlib.figure.Figure at 0xa880c8cc>" | |
| } | |
| ], | |
| "prompt_number": 77 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 220 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": "## Make an alphabet" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "alphabet = list(string.ascii_lowercase)\nilphabet = []\nfor l in alphabet:\n imLetter = makeLetterImage(l, 80)\n skeletter = mh.thin(imLetter)\n BP = branchedPoints(skeletter, showSE=False)\n EP = endPoints(skeletter)\n ilphabet.append(skeletter)", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 73 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "figsize(12,12)\nfor im,n in zip(ilphabet, range(1,27)):\n subplot(6,5,n,xticks=[],yticks=[])\n imshow(im,interpolation='nearest')", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "display_data", | |
| "png": "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\nCABAJDACABAJjAAARAIjAABRtZNeeuDOMwAAy6kwAgAQCYwAAEQCIwAAkcAIAEAkMAIAEF3qLOlX\n3AYQACBTYQQAIBIYAQCIBEYAACKBEQCAaNiTXtwGEACgDhVGAAAigREAgEhgBAAgEhgBAIi6P+ll\nyckt7uoCALCcCiMAAJHACABAJDACABAJjAAARF2d9OIEFwCA46kwAgAQCYwAAEQCIwAAkcAIAEDU\n1Ukvrzi5BQBgXyqMAABEAiMAAJHACABAJDACABA1e9LLkru6AACwHxVGAAAigREAgEhgBAAgEhgB\nAIiaOOml9AQXd3UBADieCiMAAJHACABAJDACABAJjAAARIef9OIEFwCAvqgwAgAQCYwAAEQCIwAA\nkcAIAEDUxJ1enOACANAuFUYAACKBEQCASGAEACASGAEAiARGAAAigREAgEhgBAAgEhgBAIgERgAA\nIoERAIBIYAQAIBIYAQCIBEYAACKBEQCASGAEACD6tuYvfUyftbcDAIBGqTACABAJjAAARAIjAACR\nwAgAQLTqpJdXPqePop97dcLMSCfRlL4OAAC9UGEEACASGAEAiARGAAAigREAgOg2z/Mcf+B2myYn\ncmzwOb15iQEAmqbCCABAJDACABAJjAAARAIjAADR2zu93O/36cePce7EcrT7/X72JgAAbPL2LGkA\nAK5NSxoAgEhgBAAgEhgBAIgERgAAIoERAIDo/wEWQ/Id5jkwJQAAAABJRU5ErkJggg==\n", | |
| "text": "<matplotlib.figure.Figure at 0xac6eb12c>" | |
| } | |
| ], | |
| "prompt_number": 74 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": "# Try another graph library: graph_tool" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "import graph_tool as gt", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 71 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "mG = gt.Graph(directed = False)\nv1 = mG.add_vertex()\nv2 = mG.add_vertex()\nmG.add_edge(v1,v2)\nprint gt.__version__\n#gt.graph_draw(mG)", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": "2.2.30 (commit 8ff4701a, Tue Mar 25 13:40:40 2014 +0100)\n" | |
| } | |
| ], | |
| "prompt_number": 72 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": "", | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [] | |
| } | |
| ], | |
| "metadata": {} | |
| } | |
| ] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment