Skip to content

Instantly share code, notes, and snippets.

@jeanpat
Created June 20, 2013 16:18
Show Gist options
  • Save jeanpat/5824233 to your computer and use it in GitHub Desktop.
Save jeanpat/5824233 to your computer and use it in GitHub Desktop.
Several structuring elements used with hit-or-miss operator implemented in mahotas to detect branched-points and end-points
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "Untitled5"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": "import mahotas as mh\nfrom mahotas import polygon\nimport pymorph as pm\n\nimport networkx as nx\n\nfrom scipy import ndimage as nd\nimport skimage.transform as transform\nimport skimage.io as sio\nimport scipy.misc as sm\n\nimport os\nimport math",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": "def branchedPoints(skel, showSE=True):\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 Y2=np.array([[1, 0, 2], \n [0, 1, 1], \n [1, 0, 2]])\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\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\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": 149
},
{
"cell_type": "code",
"collapsed": false,
"input": "a = np.array([[0,0,0,0,0,0],\n [0,0,1,0,1,0],\n [0,1,1,0,1,0],\n [0,0,0,1,0,0],\n [0,0,1,0,1,0],\n [0,1,0,0,0,0]])\nlab,_ = mh.label(a>0)\nsk =mh.thin(a)\nprint a.dtype, sk.dtype\nbp = branchedPoints(a>0)\nh = mh.labeled.labeled_size(bp)\nep = endPoints(a)\nsubplot(141)\ntitle('skeleton')\nimshow(a,interpolation='nearest')\n\nsubplot(142)\ntitle('label')\nimshow(lab,interpolation='nearest')\nsubplot(143)\ntitle('junction')\nimshow(bp,interpolation='nearest')\nsubplot(144)\ntitle('end-points')\nimshow(ep,interpolation='nearest')",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "int32 int32\n18 18\n"
},
{
"output_type": "display_data",
"png": "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\nHSvl5eXS1NQkra2tIiLS3t4uBQUFkp+fb0eMfgmVuVtlZaXMmDFDHA6H+P1+U1F7CJW7rKxMsrOz\nDSe8UqjMHR0dMnr0aFmzZo2cPXtWOjo65PvvvzecOLzXR7fCwkJZunSpbVlsKa2IyObNmyUjI0PO\nnDkjJSUlMmfOnCsec/r0aVm0aJE8+uijdsXol1CZ//77b8nMzJT6+nqxLCtuSivSe+4NGzbI9OnT\nDacLrrfMr7/+usyYMcNwuuDCeU23t7eLy+WSXbt22ZbDttKKiOTl5cncuXNl2LBh0tzcHFj/5Zdf\nitvtFsuyJCcnRzo6OuyM0S+9ZV6+fLmsXbtWjhw5EnelFQmeu6ysTIYMGSIej0cyMzNl5cqV8s8/\n/xhOelGwzIsXL5aFCxfKnXfeKR6PR3JycuSHH34wnPSi3l4f3crLy2XMmDG2ZrC1tK2treJ0OuXV\nV18N+vWWlha544475OGHH7YzRr8Ey/zNN9/IjTfeKH6/P25LGyz34cOH5ddffxURkR9++EEmTJgg\nL7zwgqmIVwiW+Y477pDBgwdLdXW1dHV1ycsvvyyjR4+Wzs5Og0kv6us1PXPmTHnuuedszWBraUVE\n0tPTpaamptev19fXS3Jyst0x+uXSzH6/X26++Wapra0VEQmUNp62WN36mutNmzZJVlZWDBP17fLM\n8+bNk5kzZ/Z4jNvtjov92m69zXNjY6MkJCTIkSNHbB3f+J98urq6kJiYaDpGr06dOoW9e/ciPz8f\nI0aMwNSpUwEAI0eOxFdffWU4Xf9JnL/55uTJk3ssx3veS73zzjuYPn060tPTbR0n5qWtqqrCb7/9\nBgBobGzEihUrkJeXF+sYYUtOTsaxY8ewf/9+7N+/H59++ikAYN++fYECx6vt27cH/lx18OBBrFq1\nCvfcc4/hVKEtWLAA9fX1qKmpgd/vx9q1a+H1ejF+/HjT0fpUUVGBwsJC28cZZPsIl2loaEBxcTHa\n2trg9XqRn5+PZ599NtYx+mX48OGBz8+ePQvLsuDz+eBwGP+PSkg7d+7E4sWL0d7eDp/Ph4ULF6K0\ntNR0rJAyMzNRWVmJoqIiHD9+HFlZWfjoo48waFDMX6r9snv3bhw9ehTz58+3fSy+WTmRMvG9qSCi\nK7C0RMqwtETKhNy7tywroh8azU6yFeF399gzjzB3xGMjsvEuDR1h5MjHBiL+zsBhkIjnORrRvT4i\nfU1H+6qOaMReDjdxS0ukDEtLpAxLS6QMS0ukDEtLpAxLS6QMS0ukDEtLpAxLS6QMS0ukDEtLpAxL\nS6RMH28HENlJ0tGcEB75CfCXnHwfxfiRGIhT0CN93pFe5DAQzIwd3WxHmtjERQ694ZaWSBmWlkgZ\nlpZIGZaWSBmWlkgZlpZIGZaWSBmWlkgZlpZIGZaWSBmWlkgZlpZIGZaWSBmWlkiZPi7Ni/19TwZm\nxFhfgBX9pVexvpwwulG7L3PTcy+fi2PH+H5NiOb58l4+RP8KLC2RMiwtkTIsLZEyLC2RMiwtkTIs\nLZEyLC2RMiwtkTIsLZEyLC2RMiwtkTIsLZEyloiYu4MTEfUbt7REyrC0RMqwtETKsLREyrC0RMqw\ntETKsLREyrC0RMqwtETKsLREyrC0RMqwtETKsLREyrC0RMqwtETK2FJap9MJl8sFl8sFh8OBxMTE\nwPLGjRsBAGvWrMGIESPgdruxdOlSdHZ22hGlX/rKfeDAAcyePRterxcOR3z8vguVuaqqCuXl5cjK\nyoLb7UZaWhqKi4vh9/vjOvO7776LcePGwe12w+Px4N5778XRo0fjNnP3a7rbrFmz4HA4cOHCBXvC\niM3S09Olpqamx7rq6mrx+XzS0NAgbW1tkpOTIyUlJXZH6ZdguQ8dOiTr16+Xbdu2iWVZhpL1Lljm\n1157Terq6qSrq0taWlokKytLVq9ebSjhlYJlbmpqktbWVhERaW9vl4KCAsnPzzcRL6hgmbtVVlbK\njBkzxOFwiN/vt2X8Pu5Pa4/y8nI88MADGD9+PADgmWeewf33348XXnjBRJywZWZmIjMzE7/88ovp\nKGErKioKfH7NNdegoKAAn3/+ucFEfUtLSwt8LiJISEiA1+s1mCg8J0+exPPPP4+KigpMmzbNtnGM\n/B+voaEBU6ZMCSxPnjwZra2taGtrMxHnP6W2thaTJk0yHaNPdXV1SE5ORlJSEpqamvDiiy+ajtSn\n0tJSLF++HD6fz9ZxjJS2vb0dbrc7sJyUlAQAOH36tIk4/xnr16/Hvn378Pjjj5uO0qfp06fj77//\nRnNzMwYPHownnnjCdKSQ9uzZg927d+Ohhx6yfSwjpXU6nTh16lRg+eTJkwAAl8tlIs5/wtatW1Fa\nWort27cjJSXFdJywXXPNNVi5ciUqKipMR+nVhQsXsHz5cqxdu7bHAUqx6T0TjZR24sSJ+O677wLL\n+/fvh8/nw9ChQ03E+derrq7GsmXL8PHHH2PixImm4/RbV1cXEhMTTcfo1alTp7B3717k5+djxIgR\nmDp1KgBg5MiR+OqrrwZ8PCMHohYtWoTCwkIUFBQgNTUVK1euxOLFi01E6bfz588H/jzV0dEBAPjf\n//5nMlJIO3fuREFBAbZt24abbrrJdJywVFVVITs7G2lpaWhsbMSKFSuQl5dnOlavkpOTcezYscBy\nU1MTpk6din379sHj8Qz4eEa2tLNnz8aTTz6J3NxcpKenY8yYMXjuuedMROmXX3/9FYmJiZg0aRIs\ny8LVV18dOAIer1atWoXTp0/jzjvvDPxd8a677jIdK6SGhgbceuutcDqdyMnJwbRp0/DSSy+ZjhXS\n8OHDAx8ejweWZcHn82Hw4MEDPhbfrJxImfg4rYeIwsbSEinD0hIpE/rosWVF9EMtRL6bLIhsTFyy\nax5h7IjHjvT59jiaoHCuYz3PUeme7EhDm9DL4SZuaYmUYWmJlGFpiZRhaYmUYWmJlGFpiZRhaYmU\nYWmJlGFpiZRhaYmUYWmJlGFpiZQJecFANCejRyrik+97fB7jE/8jPgH+koscDMx1tGI9z9GMORBj\nx1pvSbmlJVKGpSVShqUlUoalJVKGpSVShqUlUoalJVKGpSVShqUlUoalJVKGpSVShqUlUoalJVKG\npSVSJuSleUbuuRKx6C9zM/l8TVzmFi0T8xztpZu6LifkvXyI/hVYWiJlWFoiZVhaImVYWiJlWFoi\nZVhaImVYWiJlWFoiZVhaImVYWiJlWFoiZVhaImUsEdFzRyIi4paWSBuWlkgZlpZIGZaWSBmWlkgZ\nlpZIGZaWSBmWlkgZlpZIGZaWSBmWlkgZlpZIGZaWSBmWlkgZlpZIGVtK63Q64XK54HK54HA4kJiY\nGFiuqqpCWVkZEhISAutcLhd27dplR5QBybxx40YAwOHDh3H33XcjKSkJXq8XxcXFRjMDfc/1gw8+\n2GOer7rqKiQlJZmOTdEQm6Wnp0tNTU2PdRs2bJDs7Gy7h45YsMwdHR0yevRoWbNmjZw9e1Y6Ojrk\n+++/N5QwuGC5L1dYWChLly6NUSKyQ8j709r8y8LU0BEpKyvDyJEj8eijjwbW3XDDDQYT9d+ZM2ew\nZcsWfPLJJ6ajUBSM7NNaloVvv/0WXq8X119/PVatWgW/328iStjq6+sxatQozJkzB16vF7m5ufjx\nxx9Nx+qXLVu2YPjw4cjOzjYdhaJgpLQzZszAgQMH8Mcff2DLli3YuHEjXn75ZRNRwtbc3IxNmzbh\nkUcewbFjx3DXXXdh3rx56OrqMh0tbOXl5Vi0aJHpGBQlI6XNyMjAqFGjAACTJk3CM888g/fff99E\nlLAlJiYiOzsbs2fPxqBBg/D444/jxIkTOHjwoOloYWlqakJtbS1L+y8QN3/yifd93MmTJ/dYjve8\nl3vnnXcwffp0pKenm45CUTJS2u3bt6O1tRUAcPDgQaxatQr33HOPiShhW7BgAerr61FTUwO/34+1\na9fC6/Vi/PjxpqOFpaKiAoWFhaZj0AAwcvR4586dWLx4Mdrb2+Hz+bBw4UKUlpaaiBK2zMxMVFZW\noqioCMePH0dWVhY++ugjDBpk7AB82Hbv3o2jR49i/vz5pqPQAOCblRMpEzf7tEQUHpaWSBmWlkgZ\nlpZImdCHPi0rRjEuGRKRHRfrcTgtwtwRj40I5+mS0JFOdcRjY4DmmmKOW1oiZVhaImVYWiJlWFoi\nZVhaImVYWiJlWFoiZVhaImVYWiJlWFoiZVhaImVYWiJlbHmvlEhPRAeiOQHe3FnskV9ocOnnsb3I\nIZoxTc41cUtLpA5LS6QMS0ukDEtLpAxLS6QMS0ukDEtLpAxLS6QMS0ukDEtLpAxLS6QMS0ukDEtL\npAxLS6RMyEvzYn5vm6jGNMfkJW7/tbkmbmmJ1GFpiZRhaYmUYWmJlGFpiZRhaYmUYWmJlGFpiZRh\naYmUYWmJlGFpiZRhaYmUYWmJlLFEhBdtECnCLS2RMiwtkTIsLZEyLC2RMiwtkTIsLZEy/wc6mXbb\n4J8AaAAAAABJRU5ErkJggg==\n"
},
{
"output_type": "pyout",
"prompt_number": 158,
"text": "<matplotlib.image.AxesImage at 0x17191b2c>"
},
{
"output_type": "display_data",
"png": "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\nuDAzDMNojP8DMt2VstXfuEcAAAAASUVORK5CYII=\n"
}
],
"prompt_number": 158
},
{
"cell_type": "code",
"collapsed": false,
"input": "mh.__version__",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 159,
"text": "'1.0'"
}
],
"prompt_number": 159
},
{
"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