Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
{
"cells": [
{
"cell_type": "markdown",
"id": "608c7b2a",
"metadata": {},
"source": [
"# QUIZ WEEK 7 SOLUTION"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "fc7238e9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2 0 1 1 2 1]\n",
"line_cost = 22\n",
"zero_cost = 19\n",
"two_cost = 10\n"
]
}
],
"source": [
"import numpy as np \n",
"import matplotlib.pyplot as plt\n",
"import slgbuilder\n",
"\n",
"I = np.array([[6, 1, 5, 4, 5, 7],\n",
" [2, 7, 2, 3, 4, 1],\n",
" [1, 5, 7, 4, 2, 6],\n",
" [5, 2, 3, 5, 4, 3],\n",
" [2, 4, 3, 6, 7, 7]])\n",
"\n",
"line_cost = I[3].sum() # index 3 corresponds to z=2\n",
"zero_cost = I.sum(axis = 1).min()\n",
"\n",
"k = I.argmin(axis = 0)\n",
"print(k) # check that change is never larger than 3\n",
"\n",
"two_cost = I.min(axis = 0).sum()\n",
"\n",
"print(f'{line_cost = }')\n",
"print(f'{zero_cost = }')\n",
"print(f'{two_cost = }')\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "94b1d764",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Just checing that solution using slgbuilder is giving the same result\n",
"layer = slgbuilder.GraphObject(I.astype(int))\n",
"np.bool = bool\n",
"np.int = int\n",
"helper = slgbuilder.MaxflowBuilder()\n",
"helper.add_object(layer)\n",
"helper.add_layered_boundary_cost()\n",
"helper.add_layered_smoothness(delta=3, wrap=False)\n",
"helper.solve()\n",
"segmentation = helper.what_segments(layer)\n",
"segmentation_line = segmentation.sum(axis=0) - 1\n",
"c = (I[segmentation_line, np.arange(segmentation.shape[1])]).sum()\n",
"\n",
"fig, ax = plt.subplots()\n",
"ax.imshow(I)\n",
"ax.plot(segmentation_line, 'r')\n",
"ax.set_title(f'two_cost={c}')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "76b75526",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.10.9"
},
"vscode": {
"interpreter": {
"hash": "864c54ae2c00d287136c49aec72343cc9457da9cff5129afc5c16bdd0f87f600"
}
}
},
"nbformat": 4,
"nbformat_minor": 5
}