Skip to content

Instantly share code, notes, and snippets.

@jeanpat
Created January 29, 2014 14:13
Show Gist options
  • Save jeanpat/8688783 to your computer and use it in GitHub Desktop.
Save jeanpat/8688783 to your computer and use it in GitHub Desktop.
Image segmentation can be performed by an image labelling process. Once segmented, it could necessary to isolate in independant images the labelled regions. Think of chromosomes in a metaphase image, if resolving chromosomes overlapps or karyotyping must be performed. The following script takes "two images", (in fact two small numpy arrays:img i…
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "Extracting particles from an image- Toy model"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": "extractParticles()"
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": " Extracting particles from a labelled image: a toy model with numpy"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Image segmentation can be performed by an image labelling process. Once segmented, it could necessary to isolate in independant images the labelled regions. Think of chromosomes in a metaphase image, if resolving chromosomes overlapps or karyotyping must be performed.\n\nThe following script takes \"two images\", (in fact two small numpy arrays:img is supposed to be a gray level image and lab, the label image which could be obtained after segmentation) and returns two particles, that is two images corresponding to the labelled regions (1 or 2. 0 corresponds to the background):"
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "First let's create two image models: A grey level image as follow"
},
{
"cell_type": "code",
"collapsed": false,
"input": "img=np.array([\\\n[75,167,181,105,33,5,2,2],\\\n[72,163,193,136,54,10,1,2],\\\n[54,123,154,118,51,11,2,2],\\\n[23,54,69,58,33,18,11,4],\\\n[5,15,27,43,62,69,53,23],\\\n[5,24,61,104,147,162,124,54],\\\n[10,54,128,186,220,222,168,72],\\\n[14,72,169,230,247,238,177,76]],np.int16)\npylab.imshow(img, interpolation='nearest')\nshow()",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": "<matplotlib.figure.Figure at 0x3125190>"
}
],
"prompt_number": 18
},
{
"cell_type": "code",
"collapsed": false,
"input": "lab=np.array([\\\n[0,1,1,1,0,0,0,0],\\\n[0,1,1,1,1,0,0,0],\\\n[0,1,1,1,1,1,1,0],\\\n[0,1,2,2,0,0,1,0],\\\n[0,0,2,0,0,2,2,2],\\\n[0,0,2,2,2,2,2,2],\\\n[0,0,2,2,2,2,2,2],\\\n[0,2,2,2,2,2,2,2]],np.int16)\npylab.imshow(lab, interpolation='nearest')\nshow()",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n1dW+rnNXNBq9d5fcuXPn+rrWtWvXVFtbq5KSEs2YMUOnTp3ybS1f7wDsAnbz5k2Xl5fnLl265Hp6\nelxJSYk7ffq0b+sdP37cnT592kWjUd/W6O/KlSvuhx9+cM45d+PGDReLxVxjY6Ova6ZSKeecc7du\n3XLPP/+8O3DggK/rvf32227FihWuurra13XuCupr55xzL7/8stu1a5dzzrnbt2+7P/74I5B1e3t7\n3aRJk9zly5c9eb3Aj9gnTpxQLBbTtGnTNGLECC1btkyHDh3ybb3KykpNmDDBt9e/XzgcVlFRkSRp\n7NixKikpUUdHh69rjh49WtKd+9Ldvn1bU6ZM8W2tZDKpw4cPa+3atebeNO3s7FRjY6PWrl0rSRo+\nfLjGjx8fyNpe3wE48LCTyaSmTp167+O8vDwlk8mgxwhEW1ubmpqa9MILL/i6Tl9fn8rKypSbm6uq\nqiqVl5f7ttaGDRu0fft2DRsW3P86oVBIFRUVKi0t1QcffODbOhcuXFA4HNbKlStVWFiolStX6saN\nG76t15/XdwAOPOx/ys+8u7q6VFtbqx07dmjixIm+rjVs2DC1trbq8uXL+vrrr5VIJHxZ5+DBg8rN\nzVU8Hg/0aN3c3KxTp07pq6++0s6dO9XQ0ODLOn19fTpz5ozq6+t17tw5jRs3Tps3b/Zlrf7u3gH4\nlVde8ew1Aw87Ly/vL6emyWTS3AYEt27dUm1trZYvXx7ofdhzcnK0YMECNTc3+/L6TU1NOnDggPLz\n81VXV6fm5mYtWbLEl7X6y83NlSRNmjRJixYt0smTJ31ZJxKJKCcnR5WVlZKkxYsX6+zZs76s1V/6\nOwAPXuBhV1RU6Pz587p06ZJ6enq0b98+1dTUBD2Gb5xzWrNmjaZPn66NGzf6vl5nZ+e908Xu7m41\nNDSouLjYl7W2bt2q9vZ2Xbx4UXv27NHs2bO1f/9+X9a6K5VKKZVKSbpzFtTQ0KDCwkJf1opEIopE\nIvdiTiQSKigo8GWt/ny5A7Anb8EN0uHDh11hYaF79tln3datW31d69VXX3WTJ092I0aMcHl5ee7d\nd9/1db1vv/3WhUIhV1pa6srKylxZWZn77LPPfFvv7NmzrqyszJWWlrpYLOY2bdrk21r9ffPNN4G8\nK/7LL7+40tJSV1pa6p5++mn35ptv+rpea2urKy8vdwUFBa6mpsZdvXrV1/W6urrcxIkT3fXr1z19\nXU+uFQfwaOHKM8AgwgYMImzAIMIGDCJswCDCBgz6P69STSHCl6tTAAAAAElFTkSuQmCC\n",
"text": "<matplotlib.figure.Figure at 0x3778b50>"
}
],
"prompt_number": 43
},
{
"cell_type": "code",
"collapsed": false,
"input": "#\n#March14, 2011, A script to extract regions (particles) from an array (image)\n#Jean-Patrick Pommier\n#\nimport numpy as np\nimport os\ndef extractParticles(grayIm,labIm):\n ''' give a grayscaled and a labelled image, extract the segmented particles\n ,returns a list of flattened particles'''\n #grayIm and labIm should have the same size\n def unflattenParticles(flatParticleList):\n '''take a list of flat particles and unflat them to yield an image'''\n unflatList=[]\n lenFlatList=len(flatParticleList)\n for i in range(0,lenFlatList):\n #get the i particle:current Particle\n curPart=flatParticleList[i]#current particle\n #x values(col) are stored in the third col (3-1)\n colmax=curPart[:,2].max()\n colmin=curPart[:,2].min()\n #y values(li) are stored in the fourth col (4-1)\n limax=curPart[:,3].max()\n limin=curPart[:,3].min()\n unflatIm=np.zeros((limax-limin+1,colmax-colmin+1),np.int16)\n #number of pixels in the particle\n nbPixel=len(curPart[:,1])#count how many lines at col=1\n for line in range(0,nbPixel):\n col=curPart[line,2]\n li=curPart[line,3]\n pixVal=curPart[line,1]\n unflatIm[li-limin,col-colmin]=pixVal\n unflatList.append(unflatIm)\n return unflatList\n \n sx=grayIm.shape[0]\n sy=grayIm.shape[1]\n #flatten grayIm\n fg=grayIm.flatten()\n fl=labIm.flatten()\n labmax=fl.max()\n #print fg\n #print fl\n #build two 2D array containing x and y\n #of each pixel of the grayIm\n ax=np.zeros((sx,sy),np.int16)\n ay=np.zeros((sx,sy),np.int16)\n #vectorization with numpy may be \n #more efficient than two loops\n for j in range(0,sy):\n for i in range(0,sx):\n ax[i,j]=j#filling ax with x=col\n ay[i,j]=i#filling ay with y values y=li\n #flat arrays of coordinates\n fax=ax.flatten()\n fay=ay.flatten()\n #1D merge graylevel, label and coordinates \n #in one 1D array of 4-uplet\n extract=np.vstack((fl,fg,fax,fay))\n #transpose to watch it easily\n eT=extract.T\n #create a list of flatten particles\n #labIndex takes the value from 1 (the first particle to labmax the\\\n #label of the last particle\n flatParticleList=[]#from Matthieu Brucher\n for labIndex in range(1,labmax+1):\n flatParticleList.append(eT[eT[:,0]==labIndex])#from Matthieu Brucher\n return unflattenParticles(flatParticleList)\n",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 14
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "Extract particles with two methods: find_object() or extractParticles()"
},
{
"cell_type": "code",
"collapsed": false,
"input": "Particles=extractParticles(img,lab)\n#\nfrom scipy import ndimage as nd\n\nseg2 = nd.find_objects(lab==2)\nseg1 = nd.find_objects(lab==1)",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 39
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "Let's display the segmented particles"
},
{
"cell_type": "code",
"collapsed": false,
"input": "subplot(242, xticks=[],yticks=[])\nimshow(lab, interpolation='nearest')\n\nsubplot(243, xticks=[],yticks=[])\nimshow(Particles[0]>0, interpolation='nearest')\n\nsubplot(244, xticks=[],yticks=[])\nimshow(Particles[1]>0, interpolation='nearest')\n\nsubplot(247, xticks=[],yticks=[])\nimshow(lab[seg1[0]], interpolation='nearest')\n\nsubplot(248, xticks=[],yticks=[])\nimshow(lab[seg2[0]], interpolation='nearest')\n\nshow()",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAQUAAADGCAYAAADbnZU/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAABA5JREFUeJzt3dFq41YUQNGoGeafC4FgCOSf50V9aJl2dzzOjSNZsrzW\nY2JsOYStK+nInuZ5np8A/vHH1hsA7IsoACEKQIgCEKIAhCgA8e3SL6dputV23DVXdTmSi1H42+vF\n377MPxbalDFv0/ebvt7HTltvACzK4QMQogCEKAAhCkCIAhCiAMTAJcl9GbkEur/LlnA/rBSAuLuV\nAowwjTvm3DSuKHBgl6dx/33U8lOpp8HX3tb59y0KG7I3+5j7Sm5PFDa2p/3J/vZu7ivZghONQIgC\nEKIAxCHPKSz5GQ8GoXg0VgpAiAIQhzx8gDWsccl2jcGpUb97ZSsFIEQBCIcP/HTNUnZ/U5B8lZUC\nEKIAxE0OH56n98Wea6nl6q2/xAbuhZUCEKIAhCgA4ZIkDNpy+vCWrBSAEAUgRAEIUQBCFID48tWH\nkY8rG51BXGpacegs8eBXLny0RY9xPvr31jwj/+h/261YKQAhCkCIAhCiAIQoACEKQIgCEKIAxK5u\nnX6UW1Nhz6wUgBAFIHZ1+MBlR/jiFYeI+2elAIQoAOHwgcNyqHIdKwUgRAEIUQBCFIAQBSBEAQhR\nAEIUgDC8tLHPjdfc/zDO/b+D4xOFDc3zvPUmwC9EgcOyKrnOl6Ngvpw9sgq7nhONQIgCEKIAhCgA\nIQpAiAIQogCEKAAxzRemPKZpuuW23C2DMhzJxYlG/+zweBw+ACEKQIgCEKIAhCgAIQpAiAIQogCE\nKAAhCkCIAhCiAIQoACEKQIgCEKIAhCgAIQpAiAIQogCEKAAhCkCIAhCiAIQoACEKQIgCEKIAhCgA\nIQpAiAIQogCEKAAhCkCIAhCiAIQoACEKQIgCEKIAhCgAIQpAiAIQogCEKAAhCkCIAhCiAIQoACEK\nQIgCEKIAhCgAIQpAiAIQogCEKAAhCkB823oDYA3TNG29CXdhnudffiYKHNbL/OfQ456n98Vf+/T0\nuvhzvsw/hh73Nn0ffMbT2Z+KwobszT52bk/GukRhY6N7s1sY38Pcyvk9GetyohEIUQBCFIAQBSBE\nAQhRAMIlSQ5r9BLr6JjRGgNJr5+57Do41jL+fs6zUgBCFIBw+MBPo7P1/7W/KUi+ykoBCFEAQhSA\nEAUgRAEIUQDCJUkY9KnpwztmpQCEKAAhCkCIAhCiAISrD3zJNTdRjXrztRibsFIAQhSAEAUgRAEI\nUQBCFIAQBSBEAQhRAEIUgBAFINz7cEeep/dVn3+N70r8vzXvlWAZVgpAiAIQDh84rEf5oNWlWSkA\nIQpAiAIQogCEKAAhCkCIAhCiAMQ0z/O89UY8qmnyxQYfufbfc5qmG9zJcd9OT+f/viYaN6TH7JGV\nAodkFTbGSoGHYV93PScagRAFIEQBCFEAQhSA+As8PXvCW+4dTgAAAABJRU5ErkJggg==\n",
"text": "<matplotlib.figure.Figure at 0x37796d0>"
}
],
"prompt_number": 44
},
{
"cell_type": "markdown",
"metadata": {},
"source": "The two lower images correspond to particles extraction with scipy.ndimage.find_objects(). The two upper images correspond to particles extracted with extractParticles().\nscipy.ndimage.find_objects() is not capable to isolate two touching particles probably because it uses a bouding box whereas extractParticles() relies only on particle label.\n"
},
{
"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