From acc87560f0b17b372121e2ebf5bbff28ca66147f Mon Sep 17 00:00:00 2001 From: Lukas Winkler Date: Tue, 7 Jan 2020 19:39:58 +0100 Subject: [PATCH] init --- .gitignore | 3 +++ input.png | Bin 0 -> 683 bytes input.xcf | Bin 0 -> 1338 bytes input2.png | Bin 0 -> 3506 bytes input2.xcf | Bin 0 -> 7397 bytes input_blur.png | Bin 0 -> 3150 bytes input_blur.xcf | Bin 0 -> 10556 bytes input_slight_blur.png | Bin 0 -> 3004 bytes input_slight_blur.xcf | Bin 0 -> 8826 bytes reconstruct.py | 27 ++++++++++++++++++++++ simulate.py | 52 ++++++++++++++++++++++++++++++++++++++++++ 11 files changed, 82 insertions(+) create mode 100644 .gitignore create mode 100644 input.png create mode 100644 input.xcf create mode 100644 input2.png create mode 100644 input2.xcf create mode 100644 input_blur.png create mode 100644 input_blur.xcf create mode 100644 input_slight_blur.png create mode 100644 input_slight_blur.xcf create mode 100644 reconstruct.py create mode 100644 simulate.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b75c10b --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.idea/ +*.npy +fig.png diff --git a/input.png b/input.png new file mode 100644 index 0000000000000000000000000000000000000000..4e8c66205ac0983b73b98d5d7b26a095d16c9938 GIT binary patch literal 683 zcmV;c0#yBpP)EX>4Tx04R~2kiSa9P!z_0sejQrSp>x)gKNRXOfFR+2nsP)usWqlip3;`B&GNU zzKK3e2SM-!d;l} z#5++M88*9qnoPnUPjj1goL!uozG@qnV@~m~88Tr^LPb}asdI$Gp46ov;GU9Dnh>iu z)l9{WsFah-fv7LiZ5r~n>O4;=LwStlWfJa4xQi5-*0P}aq5|WzVQpU2T)AK_CX>@2HM@dak zSAh-}0002?Nklf~*(Yq- z(f!M^RG#)b9`}PkHx2iLS9Clk?AjX!-SYD709n&PY&3;eq6`ILS(X(M5pM{eDRh#u Rt4II<002ovPDHLkV1f+PBqRU; literal 0 HcmV?d00001 diff --git a/input.xcf b/input.xcf new file mode 100644 index 0000000000000000000000000000000000000000..93b258320b87a440d73345110888002536e7ba1b GIT binary patch literal 1338 zcmbtS$!-%t5G`+s*Pt z1eg0_TL+Q5<@{d6;ixN|VelP|>%SYqv8BJq41O9x-UCbj41Mk}^uagI!6MTL^CWuPhxRd*o=#cN!rb*|kYkK2F8243|q#M(r6jXF40 zdXWt2RTF({qlbbH)woOh=xG%_-VN{={eD8*LH}hA`HF_TsLI?yJ1MYrhJ-zaO* fE?Nux@D_@^hm$IakUhzl+VJdE>XZByM-k{3CukG| literal 0 HcmV?d00001 diff --git a/input2.png b/input2.png new file mode 100644 index 0000000000000000000000000000000000000000..9ea55355a27b4ecaf0eb65d1a7ef5f1b4a0b36ef GIT binary patch literal 3506 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 literal 0 HcmV?d00001 diff --git a/input_blur.png b/input_blur.png new file mode 100644 index 0000000000000000000000000000000000000000..40bd6eaa32a04c240f610a3c14ef0e3454ec2236 GIT binary patch literal 3150 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 literal 0 HcmV?d00001 diff --git a/reconstruct.py b/reconstruct.py new file mode 100644 index 0000000..69f1859 --- /dev/null +++ b/reconstruct.py @@ -0,0 +1,27 @@ +import math + +import numpy as np +from matplotlib import pyplot as plt + +width = 100 + +grid = np.zeros((width, width), dtype=np.uint64) + +all_data: dict = np.load("out.npy", allow_pickle=True).item() +print(all_data) +for y in range(width): + print(y) + for x in range(width): + for start, bins in all_data.items(): + pixpos = np.array([x, y]) + myradians = math.atan2(start[0] - x, start[1] - y) + angle = np.degrees(myradians) + if not np.isnan(angle): + bin = int(round(angle) % 360) + grid[x, y] += bins[bin] + # exit() +grid = grid.T +# grid[grid > 200] = 200 +plt.imshow(grid) +plt.colorbar() +plt.show() diff --git a/simulate.py b/simulate.py new file mode 100644 index 0000000..9d6977d --- /dev/null +++ b/simulate.py @@ -0,0 +1,52 @@ +import math + +import imageio +import matplotlib.pyplot as plt +import numpy as np +from scipy.ndimage import zoom, gaussian_filter + +img = imageio.imread('input_slight_blur.png') +print(img) +# img = zoom(img, 3) +width = 100 +numstarts = 6 +i = np.linspace(0, 360, numstarts, endpoint=False) +i += np.random.randint(-20, 20, numstarts) +r = width / 2.3 +ang = np.radians(i) +xstart = np.cos(ang) * r * np.random.randint(80, 110, numstarts) / 100 + width / 2 +ystart = np.sin(ang) * r * np.random.randint(80, 110, numstarts) / 100 + width / 2 +print(xstart, ystart) +plt.scatter(xstart, ystart, c="red") +plt.imshow(img) +plt.show() + +all_data = {} +show = True +for i in range(numstarts): + pos = (xstart[i], ystart[i]) + start = np.array(pos) + + bins = np.zeros(360) + for y, row in enumerate(img): + for x, value in enumerate(row): + pixpos = np.array([x, y]) + myradians = math.atan2(start[0] - x, start[1] - y) + angle = np.degrees(myradians) + # print(angle) + # exit() + if not np.isnan(angle): + bin = int(round(angle) % 360) + bins[bin] += value + else: + print(pixpos) + bins = gaussian_filter(bins, sigma=1) + all_data[pos] = bins + print(pos) + if show: + plt.plot(np.arange(0, 360), bins) + plt.xlabel("angle") + plt.savefig("fig.png") + plt.show() + show = False +np.save("out", all_data)