|
18 | 18 | "from filter import *\n", |
19 | 19 | "from geometric_transform import *\n", |
20 | 20 | "from region_growing import *\n", |
21 | | - "from edge_detection import *\n" |
| 21 | + "from edge_detection import *\n", |
| 22 | + "from dft import *\n" |
22 | 23 | ] |
23 | 24 | }, |
24 | 25 | { |
|
99 | 100 | " processed_image = sobel_sharpen(image)\n", |
100 | 101 | " elif sub_option == 'Laplacian算子':\n", |
101 | 102 | " processed_image = laplacian_sharpen(image)\n", |
| 103 | + "\n", |
| 104 | + " elif method == '图像分割':\n", |
| 105 | + " processed_image = region_growing(image, seed_point=(400, 100) , threshold=8)\n", |
| 106 | + "\n", |
| 107 | + " elif method == '频域滤波':\n", |
| 108 | + " processed_image = frequency_filter(image, sub_option)\n", |
| 109 | + " \n", |
| 110 | + " \n", |
102 | 111 | " \n", |
103 | 112 | " return processed_image" |
104 | 113 | ] |
|
111 | 120 | { |
112 | 121 | "data": { |
113 | 122 | "application/vnd.jupyter.widget-view+json": { |
114 | | - "model_id": "00032151954b42fb828aa2790db5c373", |
| 123 | + "model_id": "4d6c6bf9fd1a4f3598e6b825cb3d8e79", |
115 | 124 | "version_major": 2, |
116 | 125 | "version_minor": 0 |
117 | 126 | }, |
|
125 | 134 | { |
126 | 135 | "data": { |
127 | 136 | "application/vnd.jupyter.widget-view+json": { |
128 | | - "model_id": "47be5d2ca16447f5a3154705cf9953bc", |
| 137 | + "model_id": "6474644e0a12414b82a83da934ed6083", |
129 | 138 | "version_major": 2, |
130 | 139 | "version_minor": 0 |
131 | 140 | }, |
132 | 141 | "text/plain": [ |
133 | | - "Dropdown(description='处理方法:', options=('灰度化', '二值化', '滤波', '锐化', '几何变换', '图像分割', '边缘检测'), value='灰度化')" |
| 142 | + "Dropdown(description='处理方法:', options=('灰度化', '二值化', '滤波', '锐化', '几何变换', '图像分割', '边缘检测', '频域滤波'), value='灰度化')" |
134 | 143 | ] |
135 | 144 | }, |
136 | 145 | "metadata": {}, |
|
139 | 148 | { |
140 | 149 | "data": { |
141 | 150 | "application/vnd.jupyter.widget-view+json": { |
142 | | - "model_id": "a3e24b211b5447e990ec1f0c29488356", |
| 151 | + "model_id": "5bf6822fc8b04386a972a853c84efbbf", |
143 | 152 | "version_major": 2, |
144 | 153 | "version_minor": 0 |
145 | 154 | }, |
|
153 | 162 | { |
154 | 163 | "data": { |
155 | 164 | "application/vnd.jupyter.widget-view+json": { |
156 | | - "model_id": "bb77475af8a543bdbd0c0f2a2ba901fc", |
| 165 | + "model_id": "efcecbb0d851489d84443616f17e215d", |
157 | 166 | "version_major": 2, |
158 | 167 | "version_minor": 0 |
159 | 168 | }, |
|
167 | 176 | { |
168 | 177 | "data": { |
169 | 178 | "application/vnd.jupyter.widget-view+json": { |
170 | | - "model_id": "79d8b080ad62405dace7d9e894bacb4f", |
| 179 | + "model_id": "d265ad29c3264622b8171a6f11b8f524", |
171 | 180 | "version_major": 2, |
172 | 181 | "version_minor": 0 |
173 | 182 | }, |
174 | 183 | "text/plain": [ |
175 | | - "HBox(children=(IntSlider(value=5, description='Kernel Size:', layout=Layout(visibility='visible'), max=15, min…" |
| 184 | + "HBox(children=(IntSlider(value=5, description='Kernel Size:', layout=Layout(visibility='hidden'), max=15, min=…" |
176 | 185 | ] |
177 | 186 | }, |
178 | 187 | "metadata": {}, |
|
181 | 190 | { |
182 | 191 | "data": { |
183 | 192 | "application/vnd.jupyter.widget-view+json": { |
184 | | - "model_id": "dd64688a4b574476953c293a34e86734", |
| 193 | + "model_id": "2d2cdd9bf06f4d39832329fff88a755b", |
185 | 194 | "version_major": 2, |
186 | 195 | "version_minor": 0 |
187 | 196 | }, |
|
195 | 204 | { |
196 | 205 | "data": { |
197 | 206 | "application/vnd.jupyter.widget-view+json": { |
198 | | - "model_id": "6a61d2487aa447db8868502d1f6eb9f8", |
| 207 | + "model_id": "c2832dbb2fa345feb2869736a9b65ace", |
199 | 208 | "version_major": 2, |
200 | 209 | "version_minor": 0 |
201 | 210 | }, |
|
209 | 218 | { |
210 | 219 | "data": { |
211 | 220 | "application/vnd.jupyter.widget-view+json": { |
212 | | - "model_id": "e09dc55a769a4019b05cd8f251db0e0d", |
| 221 | + "model_id": "4b3de52f7b4c4a99a5de86544574cbf9", |
213 | 222 | "version_major": 2, |
214 | 223 | "version_minor": 0 |
215 | 224 | }, |
|
223 | 232 | { |
224 | 233 | "data": { |
225 | 234 | "application/vnd.jupyter.widget-view+json": { |
226 | | - "model_id": "44d023f03b964e488d8e2079de5f512d", |
| 235 | + "model_id": "0ac2dc72a40b4490ad9e1c4a5244d20b", |
227 | 236 | "version_major": 2, |
228 | 237 | "version_minor": 0 |
229 | 238 | }, |
|
244 | 253 | "\n", |
245 | 254 | "# 方法选择下拉菜单\n", |
246 | 255 | "method_dropdown = widgets.Dropdown(\n", |
247 | | - " options=['灰度化', '二值化', '滤波', '锐化', '几何变换', '图像分割', '边缘检测'], \n", |
| 256 | + " options=['灰度化', '二值化', '滤波', '锐化', '几何变换', '图像分割', '边缘检测', '频域滤波'], \n", |
248 | 257 | " value='灰度化',\n", |
249 | 258 | " description='处理方法:'\n", |
250 | 259 | ")\n", |
|
312 | 321 | " flip_direction = geometry_params.children[4].value\n", |
313 | 322 | " processed_image = flip(image, flip_direction)\n", |
314 | 323 | " \n", |
315 | | - " elif method_dropdown.value == '图像分割':\n", |
316 | | - " processed_image = region_growing(image, seed_point=(400, 100) , threshold=8)\n", |
317 | | - " \n", |
318 | 324 | " elif method_dropdown.value == '边缘检测':\n", |
319 | 325 | " edge_method = edge_detection_params.children[0].value\n", |
320 | 326 | " if edge_method == 'Sobel算子':\n", |
|
325 | 331 | " low_threshold = edge_detection_params.children[1].value\n", |
326 | 332 | " high_threshold = edge_detection_params.children[2].value\n", |
327 | 333 | " processed_image = canny_edge_detection(image, low_threshold, high_threshold)\n", |
328 | | - "\n", |
| 334 | + " \n", |
329 | 335 | " else:\n", |
330 | 336 | " processed_image = process_image(image, method_dropdown.value, sub_option_dropdown.value)\n", |
331 | 337 | " \n", |
|
343 | 349 | "\n", |
344 | 350 | "# 方法改变事件处理\n", |
345 | 351 | "def on_method_change(change):\n", |
| 352 | + " threshold_slider.layout.visibility = 'hidden'\n", |
| 353 | + " filter_params.layout.visibility = 'hidden'\n", |
| 354 | + " geometry_params.layout.visibility = 'hidden'\n", |
| 355 | + " edge_detection_params.layout.visibility = 'hidden'\n", |
| 356 | + "\n", |
346 | 357 | " if change['new'] == '灰度化':\n", |
347 | 358 | " sub_option_dropdown.options = ['灰度化', '灰度直方图修正', '线性变换', '对数变换', '指数变换']\n", |
348 | | - " threshold_slider.layout.visibility = 'hidden'\n", |
349 | | - " filter_params.layout.visibility = 'hidden'\n", |
350 | | - " geometry_params.layout.visibility = 'hidden'\n", |
351 | | - " edge_detection_params.layout.visibility = 'hidden'\n", |
352 | 359 | "\n", |
353 | 360 | " elif change['new'] == '二值化':\n", |
354 | 361 | " sub_option_dropdown.options = ['固定阈值分割', '自适应均值阈值分割', '自适应高斯阈值分割', 'Otsu自动计算阈值分割']\n", |
355 | | - " filter_params.layout.visibility = 'hidden'\n", |
356 | | - " geometry_params.layout.visibility = 'hidden'\n", |
357 | | - " edge_detection_params.layout.visibility = 'hidden'\n", |
358 | 362 | " if sub_option_dropdown.value == '固定阈值分割':\n", |
359 | 363 | " threshold_slider.layout.visibility = 'visible'\n", |
360 | 364 | " else:\n", |
361 | 365 | " threshold_slider.layout.visibility = 'hidden'\n", |
362 | 366 | "\n", |
363 | 367 | " elif change['new'] == '滤波':\n", |
364 | 368 | " sub_option_dropdown.options = ['均值滤波', '高斯滤波', '中值滤波', '双边滤波']\n", |
365 | | - " threshold_slider.layout.visibility = 'hidden'\n", |
366 | | - " geometry_params.layout.visibility = 'hidden'\n", |
367 | | - " edge_detection_params.layout.visibility = 'hidden'\n", |
368 | 369 | " filter_params.layout.visibility = 'visible'\n", |
369 | 370 | "\n", |
370 | 371 | " if sub_option_dropdown.value in ['均值滤波', '高斯滤波']:\n", |
|
388 | 389 | " \n", |
389 | 390 | " elif change['new'] == '锐化':\n", |
390 | 391 | " sub_option_dropdown.options = ['Sobel算子', 'Laplacian算子']\n", |
391 | | - " threshold_slider.layout.visibility = 'hidden'\n", |
392 | | - " filter_params.layout.visibility = 'hidden'\n", |
393 | | - " geometry_params.layout.visibility = 'hidden'\n", |
394 | | - " edge_detection_params.layout.visibility = 'hidden'\n", |
395 | 392 | "\n", |
396 | 393 | " elif change['new'] == '几何变换':\n", |
397 | 394 | " sub_option_dropdown.options = ['平移', '旋转', '错切', '缩放', '翻转']\n", |
398 | | - " threshold_slider.layout.visibility = 'hidden'\n", |
399 | | - " filter_params.layout.visibility = 'hidden'\n", |
400 | 395 | " geometry_params.layout.visibility = 'visible'\n", |
401 | | - " edge_detection_params.layout.visibility = 'hidden'\n", |
402 | | - " \n", |
| 396 | + "\n", |
403 | 397 | " # 初始化几何变换参数控件的可见性\n", |
404 | 398 | " for param in geometry_params.children:\n", |
405 | 399 | " param.layout.visibility = 'hidden'\n", |
|
416 | 410 | " \n", |
417 | 411 | " elif change['new'] == '图像分割':\n", |
418 | 412 | " sub_option_dropdown.options = ['区域生长']\n", |
419 | | - " threshold_slider.layout.visibility = 'hidden'\n", |
420 | | - " filter_params.layout.visibility = 'hidden'\n", |
421 | | - " geometry_params.layout.visibility = 'hidden'\n", |
422 | | - " edge_detection_params.layout.visibility = 'hidden'\n", |
423 | 413 | "\n", |
424 | 414 | " elif change['new'] == '边缘检测':\n", |
425 | 415 | " sub_option_dropdown.options = ['Sobel算子', 'Laplacian算子', 'Canny算子']\n", |
426 | | - " threshold_slider.layout.visibility = 'hidden'\n", |
427 | | - " filter_params.layout.visibility = 'hidden'\n", |
428 | | - " geometry_params.layout.visibility = 'hidden'\n", |
429 | 416 | " edge_detection_params.layout.visibility = 'visible'\n", |
430 | 417 | "\n", |
| 418 | + " elif change['new'] == '频域滤波':\n", |
| 419 | + " sub_option_dropdown.options = ['低通滤波', '高通滤波', '带阻(陷波)滤波']\n", |
| 420 | + " \n", |
431 | 421 | "method_dropdown.observe(on_method_change, names='value')\n", |
432 | 422 | "\n", |
433 | 423 | "# 子选项改变事件处理\n", |
434 | 424 | "def on_sub_option_change(change):\n", |
| 425 | + " filter_params.layout.visibility = 'hidden'\n", |
| 426 | + " geometry_params.layout.visibility = 'hidden'\n", |
| 427 | + " threshold_slider.layout.visibility = 'hidden'\n", |
| 428 | + " edge_detection_params.layout.visibility = 'hidden'\n", |
| 429 | + "\n", |
435 | 430 | " if method_dropdown.value == '二值化':\n", |
436 | | - " filter_params.layout.visibility = 'hidden'\n", |
437 | | - " geometry_params.layout.visibility = 'hidden'\n", |
438 | 431 | " if change['new'] == '固定阈值分割':\n", |
439 | 432 | " threshold_slider.layout.visibility = 'visible'\n", |
440 | 433 | " else:\n", |
441 | 434 | " threshold_slider.layout.visibility = 'hidden'\n", |
442 | 435 | "\n", |
443 | 436 | " elif method_dropdown.value == '滤波':\n", |
| 437 | + " filter_params.layout.visibility = 'visible'\n", |
444 | 438 | " if change['new'] in ['均值滤波', '高斯滤波']:\n", |
445 | 439 | " filter_params.children[0].layout.visibility = 'visible' # Kernel Size\n", |
446 | 440 | " filter_params.children[1].layout.visibility = 'visible' if change['new'] == '高斯滤波' else 'hidden' # Sigma X\n", |
|
461 | 455 | " filter_params.children[4].layout.visibility = 'hidden' # Sigma Space\n", |
462 | 456 | "\n", |
463 | 457 | " elif method_dropdown.value == '几何变换':\n", |
| 458 | + " geometry_params.layout.visibility = 'visible'\n", |
464 | 459 | " for param in geometry_params.children:\n", |
465 | 460 | " param.layout.visibility = 'hidden'\n", |
466 | 461 | " if change['new'] == '平移':\n", |
|
474 | 469 | " geometry_params.children[4].layout.visibility = 'visible' # Flip Direction\n", |
475 | 470 | "\n", |
476 | 471 | " elif method_dropdown.value == '边缘检测':\n", |
| 472 | + " edge_detection_params.layout.visibility = 'visible'\n", |
477 | 473 | " edge_detection_params.children[1].layout.visibility = 'visible' if change['new'] == 'Canny算子' else 'hidden'\n", |
478 | 474 | " edge_detection_params.children[2].layout.visibility = 'visible' if change['new'] == 'Canny算子' else 'hidden'\n", |
479 | 475 | "\n", |
480 | | - " else:\n", |
481 | | - " filter_params.layout.visibility = 'hidden'\n", |
482 | | - " geometry_params.layout.visibility = 'hidden'\n", |
483 | | - " threshold_slider.layout.visibility = 'hidden'\n", |
484 | | - "\n", |
485 | 476 | "sub_option_dropdown.observe(on_sub_option_change, names='value')\n", |
486 | 477 | "\n", |
487 | 478 | "# 显示控件\n", |
|
0 commit comments