Last active
November 3, 2018 14:22
-
-
Save hmaarrfk/4afae1cfded1d78e44c9e4f58285d552 to your computer and use it in GitHub Desktop.
Summary of the OTSU Failer
This file contains 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
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 31, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# !conda install numpy -y\n", | |
"import numpy as np\n", | |
"\n", | |
"# OTSU Failer on 32 bit can be summarized as this\n", | |
"pixel = (3, 5)\n", | |
"\n", | |
"pixel = (19, 18)\n", | |
"\n", | |
"if pixel == (3, 5):\n", | |
" possible_values = (41, 81)\n", | |
" img = np.array([[ 53, 41, 167],\n", | |
" [ 30, 81, 106],\n", | |
" [ 63, 147, 151]], dtype=np.uint8)\n", | |
"elif pixel == (19, 18):\n", | |
" poxxible_values = (141, 172)\n", | |
" img = np.array([[ 78, 214, 61],\n", | |
" [229, 104, 141],\n", | |
" [ 87, 172, 224]], dtype=np.uint8)\n", | |
" \n", | |
"selem = np.array([[0, 1, 0],\n", | |
" [1, 1, 1],\n", | |
" [0, 1, 0]], dtype=np.uint8)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 32, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"[104 141 172 214 229]\n" | |
] | |
} | |
], | |
"source": [ | |
"# in 0.14.1 after passing through OTSU, this would return 81 on 64 bit, and 41 on 32 bit\n", | |
"# for the [1, 1] pixel.\n", | |
"# To understand this, lets go through the OTSU algorithm at that pixel\n", | |
"\n", | |
"img_center = img[selem==1]\n", | |
"img_center.sort()\n", | |
"\n", | |
"histo, index = np.histogram(img_center, bins=img_center[-1]+1, range=(-0.5,img_center[-1]+0.5), density=False)\n", | |
"index = index[:-1]+0.5\n", | |
"print(img_center)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 33, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"229.0\n", | |
"1\n", | |
"[1 1 1 1 1]\n", | |
"230\n" | |
] | |
} | |
], | |
"source": [ | |
"# Just proving that I know how to use histogram (fun fact: I didn't)\n", | |
"print(index[-1])\n", | |
"print(histo[-1])\n", | |
"print(histo[img_center])\n", | |
"print(len(histo))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 34, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/srv/conda/lib/python3.6/site-packages/ipykernel_launcher.py:5: RuntimeWarning: invalid value encountered in true_divide\n", | |
" \"\"\"\n", | |
"/srv/conda/lib/python3.6/site-packages/ipykernel_launcher.py:8: RuntimeWarning: invalid value encountered in true_divide\n", | |
" \n" | |
] | |
} | |
], | |
"source": [ | |
"# Following wikipedia's notation\n", | |
"w0 = np.cumsum(histo)\n", | |
"w1 = w0[-1] - w0\n", | |
"# \n", | |
"mu0 = np.cumsum(histo * index) / w0\n", | |
"mu0[w0 == 0] = 0\n", | |
"muT = np.sum(histo * index)\n", | |
"mu1 = (muT - w0 * mu0) / w1\n", | |
"mu1[w1 == 0] = 0\n", | |
"\n", | |
"# The algorithm in 0.14.1 didn't take care of the true divide case at the very end either\n", | |
"# This wasn't actually the issue though" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 35, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"sigma2 = w0 * w1 * (mu0 - mu1)**2" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 36, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"[ 0. 0. 0. 0. 0. 0. 0. 0.\n", | |
" 0. 0. 0. 0. 0. 0. 0. 0.\n", | |
" 0. 0. 0. 0. 0. 0. 0. 0.\n", | |
" 0. 0. 0. 0. 0. 0. 0. 0.\n", | |
" 0. 0. 0. 0. 0. 0. 0. 0.\n", | |
" 0. 0. 0. 0. 0. 0. 0. 0.\n", | |
" 0. 0. 0. 0. 0. 0. 0. 0.\n", | |
" 0. 0. 0. 0. 0. 0. 0. 0.\n", | |
" 0. 0. 0. 0. 0. 0. 0. 0.\n", | |
" 0. 0. 0. 0. 0. 0. 0. 0.\n", | |
" 0. 0. 0. 0. 0. 0. 0. 0.\n", | |
" 0. 0. 0. 0. 0. 0. 0. 0.\n", | |
" 0. 0. 0. 0. 0. 0. 0. 0.\n", | |
" 28900. 28900. 28900. 28900. 28900. 28900. 28900. 28900.\n", | |
" 28900. 28900. 28900. 28900. 28900. 28900. 28900. 28900.\n", | |
" 28900. 28900. 28900. 28900. 28900. 28900. 28900. 28900.\n", | |
" 28900. 28900. 28900. 28900. 28900. 28900. 28900. 28900.\n", | |
" 28900. 28900. 28900. 28900. 28900. 40837.5 40837.5 40837.5\n", | |
" 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5\n", | |
" 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5\n", | |
" 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5\n", | |
" 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5\n", | |
" 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5\n", | |
" 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5\n", | |
" 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5\n", | |
" 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5\n", | |
" 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 20306.25 20306.25\n", | |
" 20306.25 20306.25 20306.25 20306.25 20306.25 20306.25 20306.25 20306.25\n", | |
" 20306.25 20306.25 20306.25 20306.25 20306.25 0. ]\n" | |
] | |
} | |
], | |
"source": [ | |
"print(sigma2)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 37, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"[40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5\n", | |
" 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5\n", | |
" 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5 40837.5\n", | |
" 40837.5 40837.5 40837.5 40837.5 40837.5]\n" | |
] | |
} | |
], | |
"source": [ | |
"print(sigma2[poxxible_values[0]:poxxible_values[1]+1])\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# Clearly, the issue is that this is a pathological case, where depending on the\n", | |
"# rounding error in the particular hardware implementation and software optimization\n", | |
"# the algorithm will either find 41, or 81 optimal" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"i=104, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=105, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=106, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=107, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=108, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=109, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=110, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=111, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=112, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=113, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=114, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=115, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=116, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=117, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=118, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=119, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=120, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=121, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=122, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=123, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=124, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=125, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=126, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=127, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=128, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=129, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=130, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=131, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=132, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=133, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=134, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=135, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=136, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=137, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=138, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=139, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=140, mu1=104.0 mu2=756.0 pop=5, new_q1 = 1, t=-340.0, sigma_b=28900.0\n", | |
"i=141, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=142, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=143, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=144, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=145, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=146, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=147, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=148, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=149, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=150, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=151, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=152, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=153, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=154, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=155, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=156, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=157, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=158, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=159, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=160, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=161, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=162, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=163, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=164, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=165, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=166, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=167, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=168, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=169, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=170, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=171, mu1=245.0 mu2=615.0 pop=5, new_q1 = 2, t=-495.0, sigma_b=40837.5\n", | |
"i=172, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=173, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=174, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=175, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=176, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=177, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=178, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=179, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=180, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=181, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=182, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=183, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=184, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=185, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=186, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=187, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=188, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=189, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=190, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=191, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=192, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=193, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=194, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=195, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=196, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=197, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=198, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=199, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=200, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=201, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=202, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=203, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=204, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=205, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=206, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=207, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=208, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=209, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=210, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=211, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=212, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=213, mu1=417.0 mu2=443.0 pop=5, new_q1 = 3, t=-495.0, sigma_b=40837.5\n", | |
"i=214, mu1=631.0 mu2=229.0 pop=5, new_q1 = 4, t=-285.0, sigma_b=20306.25\n", | |
"i=215, mu1=631.0 mu2=229.0 pop=5, new_q1 = 4, t=-285.0, sigma_b=20306.25\n", | |
"i=216, mu1=631.0 mu2=229.0 pop=5, new_q1 = 4, t=-285.0, sigma_b=20306.25\n", | |
"i=217, mu1=631.0 mu2=229.0 pop=5, new_q1 = 4, t=-285.0, sigma_b=20306.25\n", | |
"i=218, mu1=631.0 mu2=229.0 pop=5, new_q1 = 4, t=-285.0, sigma_b=20306.25\n", | |
"i=219, mu1=631.0 mu2=229.0 pop=5, new_q1 = 4, t=-285.0, sigma_b=20306.25\n", | |
"i=220, mu1=631.0 mu2=229.0 pop=5, new_q1 = 4, t=-285.0, sigma_b=20306.25\n", | |
"i=221, mu1=631.0 mu2=229.0 pop=5, new_q1 = 4, t=-285.0, sigma_b=20306.25\n", | |
"i=222, mu1=631.0 mu2=229.0 pop=5, new_q1 = 4, t=-285.0, sigma_b=20306.25\n", | |
"i=223, mu1=631.0 mu2=229.0 pop=5, new_q1 = 4, t=-285.0, sigma_b=20306.25\n", | |
"i=224, mu1=631.0 mu2=229.0 pop=5, new_q1 = 4, t=-285.0, sigma_b=20306.25\n", | |
"i=225, mu1=631.0 mu2=229.0 pop=5, new_q1 = 4, t=-285.0, sigma_b=20306.25\n", | |
"i=226, mu1=631.0 mu2=229.0 pop=5, new_q1 = 4, t=-285.0, sigma_b=20306.25\n", | |
"i=227, mu1=631.0 mu2=229.0 pop=5, new_q1 = 4, t=-285.0, sigma_b=20306.25\n", | |
"i=228, mu1=631.0 mu2=229.0 pop=5, new_q1 = 4, t=-285.0, sigma_b=20306.25\n" | |
] | |
} | |
], | |
"source": [ | |
"# Here is the Cython implementation written in python to show you what happens\n", | |
"# You may choose to add the print statement in cython,\n", | |
"# just remember to use `with gil:`\n", | |
"pop = len(img_center)\n", | |
"mu = np.sum(histo*index)\n", | |
"max_i = 0\n", | |
"q1 = histo[0]\n", | |
"mu1 = 0.\n", | |
"max_sigma_b = 0.\n", | |
"\n", | |
"for i in range(1, len(histo)):\n", | |
" P = histo[i]\n", | |
" new_q1 = q1 + P\n", | |
" if new_q1 == pop:\n", | |
" break\n", | |
" if new_q1 > 0:\n", | |
" # Rearrange the formula so that you only have to divide once per loop\n", | |
" # All other operations are additions and multiplications\n", | |
" mu1 = mu1 + i * P\n", | |
" mu2 = mu - mu1\n", | |
" t = (pop - new_q1) * mu1 - mu2 * new_q1\n", | |
" sigma_b = (t * t) / (new_q1 * (pop - new_q1))\n", | |
" print(f\"i={i}, mu1={mu1} mu2={mu2} pop={pop}, new_q1 = {new_q1}, t={t}, sigma_b={sigma_b}\")\n", | |
" if sigma_b > max_sigma_b:\n", | |
" max_sigma_b = sigma_b\n", | |
" max_i = i\n", | |
" q1 = new_q1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"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.6.6" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment