Skip to content

Instantly share code, notes, and snippets.

@scturtle
Created September 25, 2016 03:32
Show Gist options
  • Select an option

  • Save scturtle/6b6a7b56b161436d3838e3d9b0bf8e6d to your computer and use it in GitHub Desktop.

Select an option

Save scturtle/6b6a7b56b161436d3838e3d9b0bf8e6d to your computer and use it in GitHub Desktop.
ransac algorithm
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2016-09-25T11:29:43.702121",
"start_time": "2016-09-25T11:29:43.212586"
},
"collapsed": false,
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"source": [
"%pylab inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2016-09-25T11:29:43.919537",
"start_time": "2016-09-25T11:29:43.704674"
},
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAEACAYAAACj0I2EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnXuQHPV1779HM8vK4DUXCEYlg1YSAu1Kg8FcW3ABm018\nsZFILq5QhRVXbh6VSjlOfGMelQuBSqH4Bl9w2RJ2ghy/rstOxQ9CjIFIi8wWXiEiWSSRFXv1WGGE\nVlgyIjaOd4QLWbs6948zTff0ds/0PPo530/V1M709uM3Pb/+9unzO79zRFVBCCEk/8xLuwGEEEK6\nAwWdEEIKAgWdEEIKAgWdEEIKAgWdEEIKAgWdEEIKQmRBF5F5IvI9EXms9vkeEfmRiOyqva6Pr5mE\nEEKaUW5h3Y8A2APgTZ5l61V1fXebRAghpB0iWegicj6ANQC+4P9X11tECCGkLaK6XDYA+DMA/mml\nHxaR3SLyBRE5s7tNI4QQ0gpNBV1EbgBwTFV3o94i3whgqapeBuAlAHS9EEJIikizXC4i8jEAvw1g\nBsAbAAwA+Kaq/o5nnUEAj6vqWwO2Z7IYQghpA1Vtya3d1EJX1btUdZGqLgWwFsBTqvo7IrLAs9pv\nAphosA++uvS65557Um9DUV48lzyfWX61QytRLn4+LiKXATgF4BCAD3awL0IIIR3SkqCr6lYAW2vv\nf6fJ6oQQQhKEM0VzxsjISNpNKAw8l92F5zN9mg6KdnwAEY37GIQQUjREBNrtQVFCCCH5gIJOCCEF\ngYJOCCEFgYJOCCEFgYJOCCEFgYJOCCEFgYJOCCEFgYJOCCEpU60CO3bY306goBNCSIpUq8A73wm8\n6132txNRp6ATQkiKTEzYa2YG2LPHXu1CQSeEkIQIcq0MDgJ9ffa+XAYWLWp//52kzyWEEBIRx7Wy\nZw+wciWwbRswMABMTZl1DgCzs8C+fbasHZicixBCEmDHDvOTz8yYRf7008CVV7pCv3cvsHy5rbt/\nPzAz03pyLlrohBCSAIOD5lKZmQFKJde1MjAAbN4MbNoEnHcecNNNrsXeKpEFXUTmAfhXAD9S1f8h\nImcB+AaAQVjFoptV9eftNYMQQorN1BRw8qS9n5kxAV+71j6vWWOumKEhe01Ouuu2QiuDoh8BsNfz\n+U4AY6q6HMBTAP689cMTQkhvUKnYq6/PLPUPfchcLTt3mpjPzJiQP/CAuWPaIZKgi8j5ANYA+IJn\n8Y0Avlx7/2UA72uvCYQQUnwGBmwg9MEHzfqenTUh37fPrPK+PmDFCmDVKvOtt0NUC30DgD8D4B3d\nPE9VjwGAqr4E4M3tNYEQQnqDgQFzs1QqZqXPmwfcdpv9b3TUjXxpl6Y+dBG5AcAxVd0tIiMNVg0N\nZVm3bt3r70dGRlh7kBCSS6pVmwRUqdhn530rIuwMgq5aBRw5YssmJ4HJyXFs2zbeUfuahi2KyMcA\n/DaAGQBvADAA4BEAbwcwoqrHRGQBgO+o6nDA9gxbJITkHm8c+UUXASdO2EBnpdK6Zb1jh+1rdtY+\nL1sG7NpVv49Yaoqq6l2qukhVlwJYC+ApVf2fAB4H8Hu11X4XwKOtHJgQQvLExIQ7eLlvH3DwoOsH\nd6brR02y5QyQlssm5lu3duZqcehk6v99AK4TkUkA7659JoSQQlKp2ODlPJ9qLl5sMz+DkmyFCbwz\nQLptm1nmCxd2p42cKUoIIRGoVoGrrjLrvFw263zxYrOuFy6cOxN0dBS4/fa5U/2jEovLhRBCiLlc\n9u83IT91CvjMZ+qt60rFhNsJP1R1XTR793aWRTEqtNAJISQC3pwrK1YEW9zVqmuRA83Xb0Q7FjoF\nnRDSU3hDD1sdiPQK9sBA8335128FCjohhDQgLIWtf50oseZR9tUJ9KETUlC6VXOy1/GGHvr92tUq\nMDZmA5/vepf9ffvbgWuuAa64Yu65b7SvtKCgE5ICrQh0N2tO9jpO6GG5bLnHHV+3c45Xr3bLwe3d\nCxw4YAOg+/YB4+PB+yqVLJb8+PH0fxsKOiEJ06pAZ9ESzDt+L7D3HAMm0gsW1K9z6FD4/g4eBK6/\nPv0bLgWdkIRpVaD94XCOVUlaxxt6ODnpnnvvOa5UgC1bgMcfB6TmwRYBrr66/qnKu68TJ+yv9/dM\nw01GQSckYVoVaGdW4dNPd3/grej4RTXs3HvP8ZYtwOmnA6+8YpY6YH/f//76pyrvvubPNzeOs8+0\n3GSMciGFp5MwtbjoJJyNRCMsCqXRufduc/HFwGuvAYcP24zQF14wK9xfD3TPHisnd/iwu8+w+qGt\nwLBFQnzEHVpGsks7ourdBjDLfMkSKxd3883RJwlFmYTUDIYtEuKDA4q9geNaOXrUdbG0M/bgbFOu\nVYqYnbUUua+80prbKy03GS10Umi6YSmRbOP8xhMTJt4zM+7TGNDYvRLkiqtWgWefBW65xQZO0+o3\ndLkQEgD91cXG7yYB5rpYHPEeHDSLe3AQWLOm+YzRNPsNBZ0Q0nN4x0mctLZeq9r//5MnzS/uHeQc\nHbXIliwNnFPQCSE9hdfyPnx4brQJEG7BO9b68uU2G/TAAZv5uX17NkQ9FkEXkX4ATwM4DVZU+mFV\n/UsRuQfAHwJ4ubbqXar6RMD2FHRCSFs0Cjn1FpwYHg4XYu84Sqnk+tg3bzbxf/ll4MYb3fXHxoB3\nvzve7xWFdgS93GwFVT0hIr+qqr8QkRKAfxaR0dq/16vq+nYaSwghjWgURz4xYdb1xIStOzFhA5lB\nQjwwYOK9aRNw7bUWseJY8AsXmoAXhaaCDgCq+ova2/7aNo7J3dLdgxBCohIUcrpypRvR4q/tGUa1\n6g6ADg0BGza4yycmzN9eqbiW/qpV8X2nuInkQxeReQD+DcCFAB5U1T+vuVx+D8DPAfwrgNtV9ecB\n29LlQghpmSCXys6dlgRrdrZ+3aVLgd27g10uQZOFhoft/f79dpN46CGrDXrDDd0r2NwpsbhcAEBV\nTwF4m4i8CcAjIrICwEYAH1VVFZG/ArAewB8Ebb9u3brX34+MjGBkZKSVNpKCk8Wp+SQ7OAmyqlXg\n1ltdMe/vN5EeHGwcJ+5MFnKs/dlZE3JVe79njwn5oUPpziYeHx/HuD9Hb4u0HOUiIn8B4FWv71xE\nBgE8rqpvDVifFjoJhVPzSRhey7pUMlfJbbfZ53IZOP98N7LlvvuAc84x94kTZ753r+3niivsr3ey\n0PLltmxy0tY9dKizvCtxEFeUy68AOKmqPxeRNwDYAuA+ALtU9aXaOrcCeIeqfiBg+0iCHpeVRusv\n23QjiREpJo7LxRn4dApTOCJ88KCFG3rp7zeru1SylLaAXftOBIy/iLOTWGvNmuzNJo5L0C8B8GVY\n3pd5AL6hqveKyFcAXAbgFIBDAD6oqscCtm8q6HFZabT+sk+vTc3Pg4GRpTY+9lh9SOFjjwHnnguc\nfTZwySXAL3/ZfB+lEvDMM40NhbRnhQbRjqBDVWN92SEas327armsCqj29anu2NF0k0jEtV/SXaan\n7beZnk67JfEyPa166aXWJy+9NJvfN642Tk/b9djq/p580q5f5zU2Zsu3b1edN6/+f4Bqf79d6/39\n7rJKZe5x221PFLq175p2tqa3rW7Q8gEiCLrTifr6ut+J4tgvIe2QBwMjjja2cpPwi+H0tOrwsIn3\n8HD9cmefS5eqfuMbJvZHjlibjxyxz2NjwWIe1421m/vOraA7JyIOK61XrD+SffJgYMTRRu9Nolx2\nrewg8faLoSPopVK9oDvrt3Ntx3lj7ea+2xF05nIhqZAlP22SZNFX66eTNgb9rv7BTadmpz/b4cTE\n3AHy48eB665z9//YY8Bv/Ebn3y+ucZtu7pvJuUgu4GB1sfAmyApLSTs25k4I6usDPvlJN6bcyXao\nasu8Och37qwX9EYTiFptc1w31m7tm4JOckGvhioW8anEe3MOq7vpXW/vXje7oRMnPjxskSj791to\n4gMP2PR7J8zwssssRBGwsMVt23qjv7AEHckF7ZQGyztpVYGPG2++lakpyzMe9Lt6S7Jt2GCpagET\n6D/6IxPzmRmzzs84w/63Y4f93bYNWLbM1l25sjf6S7tQ0EnipFVvMU3SqG3q1NmM8+bhvTkvX26u\nlNFRy244MVF/7IEBV4yHhmybxYvNFeO9wS9aVH/zGxgAdu2yvtIr/aVd6HIhJAGSnkDV6jhFJ+4g\nbw3O/ftNkOfPNyvcn/bWadNFF9lMzqkpO6aTm3zlyuDB0V5wsfihy4WQjJL0U0krTwSduoMGBqx8\nm+M2OXjQjuk/trdNzz1nYj47a+scPmyiPTDQmy65bkFBJyQhBgZc0YqbVkSxG+6gSsXcJ36WL3eP\n7W3T0JANhjbzt9PF0hp0uRBSUKKGz3XLHXT0qEWnHDlin8tl4Ikn6qsIOe4ZVTuWv/4ncWHYIkmM\nIobg9TKtxk6H/f5Hj1qZt6mp4JsD5yAEE3Q+6UMniVDUELxephV3UKPff+FCi0gJcpdUq8DXvpZ8\ntE/W6eb1REEnLZNGCB7JDs1+fyc80Ru26IjWH/+xuWI44OnSzeuJgk5ahlEIvU2z3z/I4nREa3bW\nhGvjRrpbHLp5PdGHTtoiD0mmSHwE/f6OcL/6KrB6dX0c+cqVvVXIpFWCzmdcFYv6ATwN4DRYUemH\nVfUvReQsAN8AMAirWHSzqv48YHsKOiEFxzvYOTRky7xJtvzl3yjmzYktykVETlfVX4hICcA/A/hT\nADcB+KmqflxE7gBwlqreGbAtBZ0Ugm5G9iQdJRT38fwJ10ZHLScLxbt9YotyUdVf1N72w6x0BXAj\nrNYoan/f18qBs0ASuS7y0AbSnG5GIiQZJVStWuraq65q/Xj+vun97Ox3bMze+/3Aq1a5UTON+jj7\nf5eJUgUDJvzfAzAN4P/Wlv3Mt84rIdu2XbEjThqVioqz3mDUNpBs0c1KNEmVonP6V6mkr9fXjHo8\nf988csT9XKmorljh7tOp2RlUQajZdZZE/0/qeu42aKNiUTmi6J8C8DYReROAR0RkJcxKr1stbPt1\n69a9/n5kZAQjIyORbjZxEhQqdOWVyU58CGsD6ZxuuxgcC9QZ1OskEqGb+2qEN7IEsHBBJ5vhjh2N\nz42/bz78sC2bnQX27TMpd9i3z+27/v7bqI8n0f/zNJFpfHwc4+Pjne2k1TsAgL8AcDuAfQDOqy1b\nAGBfyPqqmr27ZFjtxCQL+eahxmQe6bbl5/RdpwBxN36nTmrdRr2WvP2rUnGLKEc5N95tV6xQPf98\n1yIHVC+6aK6F3mg/5bLqsmV2/KBjxNX/81CYOwzEUSQawK8AOLP2/g2wiJc1AO4HcEdt+R0A7gvZ\nPrOuhUaPiEmJLItYd59uXsRZ67uttsffvxqdm6CizWNjqkuX1os5oPrXf23/Gxtr3oYjR0zMw9wu\ncfb/PBtNcQn6JQB2AdgN4PsA7q4tPxvAGIBJAN8G8F9Cts/dXZIim2+6eRFnre+22p4gka5UzK/u\ntay9N4pKRfXJJ91tvT54QLW/v97S7nabu01er+dYBL3Tl9dCz+NdkuSTbl3EWeu7zdrjFfAga356\n2lwo8+apDg3VC7cjuoCJuH8wdPFi1Y9+VPXRR1s7D1k7h3mhHUFPbKYoJxVkB2ZKbI2s9d2w9vgH\nAD/xibkzNo8fB667zt1m3jzgkkusYtB732v9wsE7y3PPHhtMXbOmvQHGrJ3DPJDpbItJJvcn4TBT\nYutkre+GtccfNSLSPEfIqVNuxaB777VtHC64wBXgK6+0lLjtJpHK2jksKkzO1WMwU2JxccIhy2Vg\ncNAE+ROfsFmbjjV9xRW2XqkE9Pe76559NnD33fXhiP39wftnUrbskonkXHQBJEfSxYpJ92h2nVSr\nwHe+A9x6q1nc5TJw8qSt7/2dHffH2WcDN9wAvPACsGQJcOiQ3egdymXbzhsbTtdJcuSyYlGeAv+L\nAi/K/NHsOvH+3yvKgOsL90/a8eZfKZetJuihQzZ5SBWYPx94/nkrWkGSJ9M+9DDoAkieNPyZzNnR\nGc2uE+//AXOpzJ9vQr18OfDyy27eFQevi2bxYmDTJstTXirZ/2dnzdInnZNU/09d0PPul6NQNYcD\nsZ3T7DqpVCxtrTO9f8sWs66feMKE+cYbLbrlyitdYR8YsOgWxzK/+WZzweT5eswiSfb/1AV9YMAe\nH4NqEGYdClU0iv4UlsRNPep1omqhiKtWmatEFThwwP3/3r3A9de7/XVqyvWdO9Eueb0es0qS/T91\nQQfyG9JUdKHqFnl/Cgujk9S07dDoOpmYAPbvN2t8ctL6YrVqA6ROci6H2Vm3vwb9Nnm9HrNKkv0/\nE4KeFVq1tIoqVN0mz09hYThPZ6tXm5jGdVOP2ieD+qIj8oBZ7R//uK3nF++i/TZZo9k57uYTXupR\nLlmh3WgbRoz0Jt4IEcAGEv3hgZ3SqE8GhTD6+2JQiCrA/polGv3GuQxbzAr+ElpBYV6EOHjFcvly\n4IEHzG/dTZH0hxVu3AisXWv/84rA5s3mCw+KT6fBkW0a6Q4FvQM44Ya0Stxi6bXeymW76INytAwO\n2sAm53Hkj0a6Q0HvEFozpBt0a+azM/NzfBz49KdtMNMpwHz77SYCg4M209P5H58sk6Obv3OQ7lDQ\nCUmZMJ9oqxd/tWrRM072w/5+E21nn0B9BkQ+WSZLEjPcY5kpKiLni8hTIrJHRH4gIv+rtvweEfmR\niOyqva5vt+GEFIWgUNajR4HLLzcBiBraODFhtTodZmeB9evN3QK4oYULFzJKJQ2yGrLc1EIXkQUA\nFqjqbhF5I4B/A3AjgPcDqKrq+ibb00InPYPfJ7p5M3DttcAPf2j/D0p4FbYfr4W+YoWFHu7fH24R\nMsldciQx5paIy0VEvgXgrwFcA+C4qn6yyfqJCzo7NombRn3M6xOdmKgPb1y6FNi9294366PVKvDs\ns/Ze1WZ4zs6GZ0FkkrtkiXvMLfbkXCKyGMBlAHbWFn1YRHaLyBdE5MxW9hUXnI5P4qZZH/POtHRy\nrDj097vW97veZX/D+ujAAPDud9trxQob9ARM0Bctql83qy6AIpPFGbWRBb3mbnkYwEdU9TiAjQCW\nquplAF4C0ND1khTs2CRuovYxx4q/9143g+Fzz9l0fGd26cSEa4U3YmrKtfKDsiBy1jIBgHKUlUSk\nDBPzv1PVRwFAVf/Ds8rnATwetv26detefz8yMoKRkZE2mhoNp2M7vi12bNJtovQxrwtkaAgYHnZz\nrTz0UPeP6UwvZ9ht90jadTs+Po7x8fGO9hHJhy4iXwHwE1W9zbNsgaq+VHt/K4B3qOoHArZNxYfO\njk3iwLnIBwfNSg7rY/4ZgKOjwJNPAvff767j1Pzcvp1pJrJGFsYkYhkUFZGrATwN4AcAtPa6C8AH\nYP70UwAOAfigqh4L2J5RLiQ1umlltRJjHhQF8eMfm7XuXA5f+hJw000U5yyShVQgnFhEiIduW1lB\nF/nKlfWulQ0brBCzI/Rei3rHDuCaa4BTp2x/S5cCn/2suz5Jhig3+SykAqGgE+Kh21aWPyHXhg22\n3MmrArhZF4MSZlWrNsHIiUn3rs8ww2Ro5SaftouLgk6IhzisLCc2/JZbbJDTCUncv98VdW/BZb9o\nHD1qE42cKkEAc7AkSRZcKVHJZZFoQuIijuINAwPA6ae7Aj45aalzn3jCLR7hiHlQWOPChcCuXbb+\n8LBbxJnRWMlQ9PBOCjopNHFM/vCLwvCwifyWLXbz2Lq1sWgMDFju9FLJHSAlyVD0Ck10uZCep51I\nGMf18uqrwN13z82x0sz/mqdHf5IO9KET0iJBg2SAG2vuDGxWq8A//RPw679ubhNnu4kJtwhzX59l\nQ1yxIjxyxRvHzrS3pBEUdEIaEGSJB00Auv12t0rQyZPAxRcDBw8CJ04A8+cDzz9vQu9NulUumwvl\nxAn7PDxsRSm8wu6/eWze3HhyEultOChKSAhhCbX8/nBVN0/La6+Z9b1/vyvUr71mQuzdrlIBPvYx\ndx3AcpmvXl1/LH8OmMOHs5PcqZuV50l6UNBJTxCWUMs/SHbFFa5Q9/dbDnInyyFgy9asqd9u+3bg\nbW+be0z/sbIaYcEMpcWBgp4BaB3FT5iYOm4Yx+3hCPXoqM3kVAV++Utbd9484G//1twt1Wp9BM0V\nV9gxSiULW3TS3XqPldUIi7gylLJfJw996CmThSRAvYI/8qTRud+xw/7nDHg69Peb8AXN7vTuH8hP\nIq24JmCxX3cGfeg5hPnbk8FviQONz32lAixZMnc/J06YyAf9Vl6LPYvFD8KI48mB/TodCi3oeXjk\ny6pftUhEHRD1nvuBAWDTJuAtbzE3yvz5tt78+RbRMjg4t2pQnun2DYj9Oh0K63LJ0yNf2kmAikLY\nBCF/aOKDDwJr19ZPAFq0qD6Zlrf/LF5s4v7ii8BPfgLcdZe7rjdunTVs62G/7ox2XC5Q1Vhfdojk\n2b5dtVxWBVT7+lR37EilGSQhpqdVL73UfvNLL1U9csT6wPS0+7++PtX581VLJfs8PR287fT03P4z\nNuauY0Olc5d790lIp9S0syW9LazLhY98vYXXZ7tnj2U0dFwsgFnSDz5oE4UcH/jXv+5a9X5/b6P4\ndMDcMP7lfl9xHlx+pGA0U3wA5wN4CsAeWNWiP60tPwvAtwFMAtgC4MyQ7RO6n81letosc1pNxcdr\nhS9bFvx0duSIWeiAqojqvHm2zeSku43fcnf6j3f/lYpZ5v7lzax+QloBbVjoUUrQLQCwQFV3i8gb\nAfwbgBsB/D6An6rqx0XkDgBnqeqdAdtrs2MQ0g28/vCgPClBoYje3OWLF1umxIULG+/f7xMOWs7k\nW6RTEsnlIiLfAvA3tde1qnqsJvrjqjoUsD4FncRKWE1Pv8h6461LJRNbb+7ybgpvFkqYkXzTjqCX\nWzzAYlhh6O8COE9rRaFV9SUReXMr+yKkG3izHi5ZYtEoP/2phRX67Qgn3nrPHuDss80av/Za4Oab\n3bJyx4+7s0A7wXusLEV5dLNoNskekS30mrtlHMD/UdVHReQVVT3b8/+fquo5AdvRQiex4XejnHaa\nFWF2MiWGzej0Zz3ct88tK5f1MNd2yVMoL4nRQheRMoCHAfydqj5aW3xMRM7zuFxeDtt+3bp1r78f\nGRnByMhIK20kPUYrVqQzo9MpvOzkXXGiUZzIE68bJSjrobesXNA2RSAomqdo3zHPjI+PY3x8vKN9\nRLLQReQrAH6iqrd5lt0P4BVVvZ+DoqRbtGNFHjhgwn7ypLusv9+s9qB9BPm3geL7vOnXzxexDIqK\nyNUAnoaFLGrtdReAZwE8BOACAFMAblbV/wzYnoLehF71a4YVnHBcKOWyiU6YFels/+qrwHve4/rM\nSyXgkUeAc88N91+HDZpmzefdbXrhOxYFVizKIb3q1/R+76EhYMMGS0FbrQIXXmiFJJzqQEFhhN7t\nL77YXC6Ou2XFCuC7383PeezVGzppDLMt5pA0stJlYQaj93tPTLjVffbudf3fs7Pm3262/YED7qBo\nqWSl3/IijHkuLpGFfkTqoaCnTNIpCrIiIM73LpXss3NDE3HPhzeMMGz7vj7goossTLFUsgHS4eFk\nv0sn5DXNbFb6EamHgp4ySVexyYqAON97yxYTZ+eGtmqVWzEImFuX07/96KgJ+eHDdjM4eNBmieZF\nYPKacygr/YjUQx96j5FGpEMzH3HY1Pkog6PeKfYOzQZTs0YeByoZMRM/HBQlkYhTQPzi3cqgr3fb\nRoOj3vUA4PLL3Th0AFi2DNi1iwITN3m8EeUJDoqSSMRVHi3Irxr10dy/bdjgqH89wKbwL1tmlvmy\nZfaZAhM/eSqzF0QRB3Up6KRrRMkrHuYj9m/rHRz1bhd0jIULzSLfts3+hmVLJMShqIO6dLmQrhHm\nV43yaB42e7NRxkT6bkm75CG9MX3oJHWaiXejAdKoPln6bkmn5MEwoKCTTNOrs2JJNsm6YUBBJ5km\nD4+5hGSFwkW5FHEUusg0+70GBy0SBbDJQIsWJdc2QnqBzAp6UUehi4r397rqKuCxx4CxsfrfbWrK\nTXE7M1MfisgbN2E/6JzMCjqnFucLf7KtG28ErrvOxN25QAcHLddKuWx+y5UreeMmBvuB0elNLbOC\nntccF71ItWo5yYeGXJeKw/79JvTVquVYOXTICjNv3mwDUVm7cdNKTIes9YM0CJo01yqZFfSkk1aR\n9nA64erV9vmb36zPdjg0ZDdj7wU7NeW6W7J046aVmB5Z6gdp4b+ptUNTQReRL4rIMRH5vmfZPSLy\nIxHZVXtd397hG5P3qcXNyJM1GNZWbyecnLQqQTt3mv98bAzYvt1+v7ALNks3blqJ6ZGlfpAW/muk\nHaKUoLsGwHEAX1HVt9aW3QOgqqrrmx6AYYuB5Ckmu1FbG80O9U8gynrcbx4mm5Bi471G3vSmGMIW\nVfUZAD8L+FdLB3LIk1UaJ3myBhu1NciyCnNdOE9cQDb7AK1EkjadeiU68aF/WER2i8gXROTMKBvQ\nR+mSNZ9hoxtts7b6hXrnzvAbQNb7QNHdfKTYlJuvEshGAB9VVRWRvwKwHsAfhK28bt06AMCLLwI/\n+MEITp0aef1C77WZgl5XxLZt6bognLYMDloESpj7x7Fcnf8D5h8HrLCzP+/50JC9Jifn3gCCrP1e\n6wOEBDE+Po7x8fHOdqKqTV8ABgF8v9X/1f6vDtPTqpdeqtrXZ3+np7WncL5/uZz+9/e2Zdky1VJJ\nFbDPn/tceNump1UrFVsXUB0eVn30UdVPfcrdR1+f6tiY6o4dc/fT632AkKjUtDOSRjuvSLlcRGQx\ngMdV9ZLa5wWq+lLt/a0A3qGqHwjZVr3HyPrAWJxkKZeJvy2DgxYjXi7bsrCBWm9pOD/9/bY8SmWi\nXu0DadCsBCDJJrHkchGRrwLYDuBiETksIr8P4OMi8n0R2Q3gWgC3Rj1gL/sos+Q397dl61Zg40YT\nc2e257PPBm/njTP3MjMDfOYzzQcUe7kPJE3WxyxId2G2xYRJ2jptJf94tWpT9Scm7P+VihtH7t/u\n2WeBX/y8wVXrAAAPrklEQVQCuPNOdxJEpQJs2WITh2gNZoMsPRWS1mD6XFJHs/jxIKEfG7NZnzMz\n5n7ZuBFYu7ax+8Sx5IeHGw+ukuRJK7aebp7OoaCTOsKssygThfbsae5Pj3o8ki5pPBXmZdJclilc\nPnQSTpQJWmE++ygThbz+9L17ga9/HTh6tPExszRGQFySHrPI06S5okELPYdEtYCqVZvkIwKsWtVa\noWXvOqWS5THv67O/Tgx92DEZwdLbMIVCd6DLpUeI4tpoJvpRhLdaNcv8Qx+qD1OkO4U0gzf2zqGg\n9wiNLCBnMOrVV93BzU4E2G+pt+JTJ4S0DwU9x7QaFRBkAfmn3wPu9PtOBNg51qJFlsecVhch8UNB\nzyndigrwu2JGR4EzzqiPM2coGSH5gFEuOaVbUQHeKJPlyy3byqJFtv+jRzljkJC4STs9OAU9A3Qr\n3M8JORwdtc+rVwMXXmgCfu21xQolS/vCIcRPFtIsJCLovOga083CCgMDwOmnW3HmmRngtdcsQsUp\nzlyEGPEsXDiE+MlC/H0igs6LLhivldnNyR9ei19qHrhyGdi0qRjVeLJw4RDiJwsT6xIR9F696Bq5\nBbphZTr7P3AA+NznzE8OuBb/gw+6gj4zA7zySjGyHGbhwiHZJE1XXBZKGLZbsaglevGiaxa50mnl\nHu/+Z2dtAHT+fOD554GFC22dJUvs3AdVDsoz/gpKeb9Bke6QhRwy3nKMaZCIhZ73R/x2aOYW6NTK\n9O7fiQp97TVg82a3Y69ebctHR4v3G+QhpzoHbpPFe02E5fNvRt5/s0QEPcsXXVxEEexPfAL4x3+0\nv53s33GrzJ9v6Wu9HXty0mLRe/E3SJM8D9zmVdQqFXdC3ewscMstrX2HPP9mr9OsRh2ALwI4Bk/d\nUABnAfg2gEkAWwCc2WD7zgrr5Zjp6cZ1Nctl1fnzrRZnpaL65JPuutPTqtu3N6656ex/clL1859X\nPXKkfv+s25ke27fb7+vUWN2xI+0WRSNLdW/b4ckn2z/vWfvN0EZN0SiCfg2Ay3yCfj+A/117fweA\n+xpsn8R3T50oAuys99nPuh3H+yqV7CI6csQEvly2v+1cVGE3E5IMeb2pZk3UWqWT85613ywWQbf9\nYtAn6PsBnFd7vwDA/gbbJvDV06WRVeMVeme9Usks874+10J3RL2vT/XTn64X+rGx9L4baZ883FT9\nhkjWRK0dOjnvWfrN2hH0dn3ob1bVYzW1fgnAm9vcTyEIGwD1++R27nSjUmZmrIjE889bHc5KxfW3\nDw6m+31Id8j6wG2QzzgLoXed4j3vrY4HZP03a0a3whYbZt9at27d6+9HRkYwMjLSpcNmA2eA0kln\nG1YZSKR+vfe/3zrOwoVWjNkJt3L2uW+f1elctSq970aKS1jobNqhd90iC2GMrTA+Po7x8fGO9hEp\n26KIDAJ4XFXfWvu8D8CIqh4TkQUAvqOqwyHbapRj5J1G6Wy9ecuB8PhpbzbEsPWYMZF0i6JXFsp7\njdvY0ueKyGKYoF9S+3w/gFdU9X4RuQPAWap6Z8i2PSHoQYSVgAtbt5k1kTeLg2SfIlcWyvsNKxZB\nF5GvAhgBcA4sfPEeAN8C8A8ALgAwBeBmVf3PkO1zL+hhVnEja7lV8Y1iTeTd4iAkafJ8w4olH7qq\nfkBVF6pqv6ouUtUvqerPVPW/q+pyVX1PmJgnRZwTIcImG1SrwFVX2fKrrqo/drUKfO1rJvZe/2Sj\ndvpzmR8/Pnc95jAhpDXyPsjZKrnPhx737K6wCJadO13B9k4zdtrzJ39iwlsum/guWtS4nUG5zP3r\nFSECodfI66zLtOF5a4/cC3rcqVRbtYq97ZmdBT7zGRPfqanm7fTnMg9aLw2LI82LK88XdiGmkqcA\nz1v75F7Q43ZDhFnFV1xhxy6VLLRQ1Tqe33WyeHFr7cyaWyXNiyvvFzbztrdHlPOW5xt9rLQ6E6nV\nFxKYKRrX7K5m0/mnp20WpzNN35lZ12h5lHZmabZamlPBe3kaei/T7LzlPd9MVBDX1P9OXkkIehxE\n7TRhopN3MXKIKkpRc9nEcey46MZ3ytLNOU80Om9Fubaa0Y6g597lEhdRH/tefdVSdvpdJFGiVvJA\nlIHYuFwjaQ4Cd+s79VqURTOiukoanbesuSUzRat3gFZfyLGF3ijjodeCr1TMxRK0TpDrxfv/blu1\naVBEi6mI3yltuukq6YUnH9BC7z5hc6KiFJEYGLDtg6JW8j7g56WIFlMRv1PadHOQmE8+wVDQQ5iY\nMCGenTXBDiohd9FFwLx5wLJlwRd8tQrceqt1YMDWD0vclecIiCLGxxfxO6UNb5Lx0/OC7vj0jh6t\n9+0NDlrIYVjnq1aBgweBU6fsb5CFPTFhGRMdXnvNfV+0zl1Ei6mI3ylNeJOMn54WdMft8c53Ahde\n6Lo/jh612pwvvGDCvnnz3M738MPAiRP2/sQJqw3qp1IBlixxP7/4omuJs3OTXoQ3yXjpaUF3pu/P\nzpr17Lg/Nm1yC1FMTQGHD8/d1pkwFPYZsE67dau5ZIIscXZuQkg3iZQ+t6MDZDTbopNca2LCPvf3\nm/tkxQqzyNesaZx2s1q12aKTkxaWuHNnuDDnOeMbISQdYsuH3glZFXRvKtpyGfjmN4Fzz3VFN4oI\nHz1q1vwNN1jVIUII6RYU9BboNPl9J8UmWHWIENKMWPKh55Eos9E6HZRsN+ywSPHnhJBs0ZGgi8gh\nEfl3EfmeiDzbrUZ1gjdy5fLLzS0Stt7EhDtI2WrmtnbDDosUf04IyRYduVxE5CCA/6qqP2uwTtdd\nLo1cFjt2mJjPztrnZcuAXbvmlo575zttH4ODwPz5wIED7blOWh3szHudQ0JIMiTuQxeRFwC8XVV/\n2mCdrgp6M991tWqW+Q9/aJ+Dam/6Rd8hqTqdjHohvQLHi9onDR+6AnhSRP5FRP6ww31FIshl4fWZ\ne2O/y2WzwBctqt+Hf8KPwwUXzF23G/h9+ow/J70Ax4uSp9zh9ler6o9F5FyYsO9T1Wf8K61bt+71\n9yMjIxgZGQndYbM7uuO7dlwWTq3OiQkT6a1bLYRw61bg2muBQ4csptxryTuiv2oVcOSIu++pqbnr\ndkon0TCE5Jkg4yvup988Mz4+jvHx8Y720bWwRRG5B0BVVdf7lkd2uUQVP6/LYmKi3n3ylrdYweap\nKTfOPMyVcvSoif4LL7jbd9vt4o13T8qlQ0gW4HhRZyTqchGR00XkjbX3ZwB4D4CJdvcHRI8AGRhw\nxXxwsN59cuSIWd7nnDM3CsXv+li40AZMt2wxyz+ORFlFS8JFSFSYryh52rbQRWQJgEdgfvQygL9X\n1fsC1mvZQvff0atVm1oP2HR7oN6Sf+gh4Nd+rd59smyZuVUOH3ZFtNlgalwDlRwEJYS0SiFmivrF\nz59zpVIBNmwAVq923Rijo1YK7kMfcuPO/e4Nuj4IIXmiEDNF/REg/pzi+/YBIvX1Om+5BbjpJuDM\nM4GlS4PdG3R9EEKKTiIW+vbt2nYc6tGjJtJO7vHhYdf9smePFV/2W+tnnFFv4Tvrr1jhumDo+iCE\nZJnMWuiN4lCb5V2ZmnIjUMpl4P77zWqvVq1ep2NtO5b3qlWuhe+4a667zl7vfW+xxTxqRfUiw3NA\neplELHRAA/3WUcIUvQOly5fbsv37TdxPnjRXyubNwZa3128OAKUS8MwzxfSdM96d54AUi8xa6GF+\n6yhhit7Qp3vvNR/6zIxVGJqdte0OHw6eeVmpAEND7ufh4eL6zpn0i+eAkEQE3YlDBeoLMg8Ohg9U\n+qfzr1wJ3H23637p7zcr3ZktGvSYPTAAbN8OjI3Za/v24lpsHPTlOSAksbBFb4bDvj6zolauDHaX\nODM4Dx1yH50nJoIrDC1aZNP1+ZjNeHeA54AUh0zHofv92YAJ88aNwNq17sUXli1x5crgSUeMLyeE\nFJFMC7p3wMoZ0CyVrDCz17JulM88yPpivghCSBHJtKADriCffXb9VH2vZe0V/sWL3eyJjeBjNskT\nzBFOopB5QXfwW+FLlwK7d9t7J+FWowlAvCBIXmFoJYlKZsMW/VQqFkLo0N9fnwx/zZrGYs6k+SSv\nMLSSxEkqgj4wYAm25tWO/txzwKZN0To6LwiSZxhaSeIkteRcK1YAp51m78tlC1OM0tF5QZA8wxzh\nJE5SS58bFG64cmW0wU0OghKSLBy3Sp7EB0VF5HoAD8As/S+q6v0B6wQKOsMNCckHHMhNh6RL0M0D\n8DcA3gtgJYDfEpGhxlu58NGzPTotIktceC6jEXXciuczfTrxoa8C8JyqTqnqSQBfB3BjKzvwF7Mg\nzeFF0z2SPJd5TusbddyKfTN9OhH0twB40fP5R7VlhBAPeQ+15dN0fshcCTpCikYRQm35NJ0P2h4U\nFZErAaxT1etrn+8EoP6BUStwQQghpFUSi3IRkRKASQDvBvBjAM8C+C1V3ddwQ0IIIbFQbndDVZ0V\nkQ8D+DbcsEWKOSGEpETsE4sIIYQkQ2yDoiJyvYjsF5EDInJHXMfpFUTkkIj8u4h8T0SeTbs9eUNE\nvigix0Tk+55lZ4nIt0VkUkS2iMiZabYxT4Scz3tE5Ecisqv2uj7NNuYFETlfRJ4SkT0i8gMR+dPa\n8pb7ZyyC3umkIxLIKQAjqvo2VV2VdmNyyJdg/dHLnQDGVHU5gKcA/HnircovQecTANar6uW11xNJ\nNyqnzAC4TVVXAvhvAP6kppct98+4LPSOJx2ROQgYZto2qvoMgJ/5Ft8I4Mu1918G8L5EG5VjQs4n\nYP2UtICqvqSqu2vvjwPYB+B8tNE/4xIITjrqPgrgSRH5FxH5w7QbUxDerKrHALuoALw55fYUgQ+L\nyG4R+QJdWK0jIosBXAbguwDOa7V/0uLLD1er6uUA1sAeya5Ju0EFhBECnbERwFJVvQzASwDWp9ye\nXCEibwTwMICP1Cx1f39s2j/jEvQjABZ5Pp9fW0baRFV/XPv7HwAegbm1SGccE5HzAEBEFgB4OeX2\n5BpV/Q9PatXPA3hHmu3JEyJShon536nqo7XFLffPuAT9XwAsE5FBETkNwFoAj8V0rMIjIqfX7t4Q\nkTMAvAfARLqtyiWCeh/vYwB+r/b+dwE86t+ANKTufNZEx+E3wT7aCv8PwF5V/ZRnWcv9M7Y49FrI\n0qfgTjq6L5YD9QAisgRmlStsMtjf83y2hoh8FcAIgHMAHANwD4BvAfgHABcAmAJws6r+Z1ptzBMh\n5/NXYf7fUwAOAfig4wMm4YjI1QCeBvAD2DWuAO6Czb5/CC30T04sIoSQgsBBUUIIKQgUdEIIKQgU\ndEIIKQgUdEIIKQgUdEIIKQgUdEIIKQgUdEIIKQgUdEIIKQj/H41CPN3dj5FtAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10473d2b0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"xs = 20 * np.random.random((300, 1))\n",
"ys = xs * 2 + 1 # true model\n",
"ys += np.random.normal(size=ys.shape)\n",
"out_xs = 20 * np.random.random((100, 1))\n",
"out_ys = 40 * np.random.random((100, 1))\n",
"X = np.vstack([xs, out_xs])\n",
"y = np.vstack([ys, out_ys])\n",
"pyplot.plot(X, y, '.')\n",
"data = np.hstack([X, y])"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2016-09-25T11:29:43.955226",
"start_time": "2016-09-25T11:29:43.921327"
},
"collapsed": false
},
"outputs": [],
"source": [
"def line_fit(data):\n",
" x, y = data[:, 0], data[:, 1]\n",
" return np.linalg.lstsq(np.vstack([x, np.ones(x.shape[0])]).T, y)[0]\n",
"\n",
"def line_err(params, data):\n",
" k, b = params\n",
" x, y = data[:, 0], data[:, 1]\n",
" return (y - (k * x + b))**2\n",
"\n",
"def ransac(data,model_func, err_func, min_fit, max_iter, min_err, min_good, *, debug=True):\n",
" it = 0\n",
" best_model = None\n",
" best_err = np.inf\n",
" best_inlier_idxs = None\n",
" while it < max_iter:\n",
" it += 1\n",
" all_idxs = np.arange(data.shape[0])\n",
" maybe_idxs = np.random.choice(all_idxs, min_fit, replace=False)\n",
" maybe_model = model_func(data[maybe_idxs])\n",
" test_idxs = np.delete(all_idxs, maybe_idxs)\n",
" test_errs = err_func(maybe_model, data[test_idxs])\n",
" also_idxs = test_idxs[test_errs <= min_err]\n",
" if len(also_idxs) >= min_good:\n",
" better_idxs = np.concatenate([maybe_idxs, also_idxs])\n",
" better_data = data[better_idxs]\n",
" better_model = model_func(better_data)\n",
" better_errs = err_func(better_model, better_data)\n",
" err = better_errs.mean()\n",
" if err < best_err:\n",
" if debug:\n",
" print('iter: {} better model: {} #inliers: {} err: {}\\n'.\n",
" format(it, better_model, len(better_idxs), err))\n",
" best_model = better_model\n",
" best_err = err\n",
" best_inlier_idxs = better_idxs\n",
" return (best_model, best_inlier_idxs)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2016-09-25T11:29:44.095466",
"start_time": "2016-09-25T11:29:43.957042"
},
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"iter: 5 better model: [ 2.0046435 0.98879971] #inliers: 316 err: 1.1834110755893803\n",
"\n",
"iter: 9 better model: [ 2.01288469 0.98292052] #inliers: 311 err: 1.0823027699597823\n",
"\n",
"iter: 14 better model: [ 2.01666261 0.6639617 ] #inliers: 289 err: 0.9507770665684238\n",
"\n"
]
}
],
"source": [
"(k, b), in_idxs = ransac(data, line_fit, line_err,\n",
" min_fit=3, max_iter=300, min_err=10, min_good=250)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2016-09-25T11:29:44.362177",
"start_time": "2016-09-25T11:29:44.097758"
},
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x10d59b1d0>]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\ngg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10ce58a90>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"pyplot.plot(X[-in_idxs], y[-in_idxs], '.')\n",
"pyplot.plot(X[in_idxs], y[in_idxs], 'g.')\n",
"pyplot.plot(X, k * X + b, 'r')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment