当前位置: 首页 > news >正文

实验八 基于Python的数字图像问题处理

一、实验目的

 培养利用图像处理技术解决实际问题的能力。
 培养利用图像处理技术综合设计实现的能力。
 掌握在Python环境下解决实际问题的能力。
 熟练掌握使用cv2库对图像进行处理
 熟练掌握使用区域生长法提取图片中感兴趣的区域

二、实验内容

本次实验内容为:综合应用-区域生长算法提取感兴趣区域
通过手动设置初始种子点,利用区域生长算法得到脑部区域,这在医学领域可以辅助医生进行医疗诊断。
案例描述:
区域生长算法常用于提取图像中的感兴趣目标区域,为后续图像分析做准备。
本案例采用区域生长算法提取医学图像中的人的脑部区域。
案例数据:数据为1张人脑图片brain.jpg。
 案例步骤参考:
(1)导入包;
(2)读入图片srclmg(单通道灰度图);
(3)构造一个跟原图等大小的零值标记矩阵a;
(4)手动选取初始种子和生长阈值;
(5)运行区域生长算法,得到前景目标标记矩阵a;
(6)由前景目标标记矩阵a跟原图点乘得到感兴趣区域并显示结果。

三、完整实验程序、结果与分析

代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
from collections import deque# 读取图像为灰度图
srclmg = cv2.imread("D:/tuxiang/brain.jpg", cv2.IMREAD_GRAYSCALE)
if srclmg is None:print("Error: Image not found.")exit()# 显示图像并选择种子点(使用阻塞模式)
plt.imshow(srclmg, cmap='gray')
plt.title('Click on the seed point and close window to continue')
seed_points = plt.ginput(1, timeout=0)  # 必须点击1次
plt.close()# 验证是否获取到有效种子点
if len(seed_points) < 1:print("Error: No seed point selected!")exit()# 转换坐标并初始化参数
x_seed = int(round(seed_points[0][0]))
y_seed = int(round(seed_points[0][1]))
seed = (y_seed, x_seed)  # OpenCV坐标格式 (行, 列)
threshold = 10  # 明确定义阈值参数 <-- 修正关键点# 创建标记矩阵
h, w = srclmg.shape
a = np.zeros_like(srclmg, dtype=np.uint8)# 初始化队列并添加种子点
queue = deque([seed])
a[seed] = 255# 定义8邻域偏移量
neighbors = [(-1, -1), (-1, 0), (-1, 1),(0, -1), (0, 1),(1, -1), (1, 0), (1, 1)]# 区域生长算法
while queue:i, j = queue.popleft()for di, dj in neighbors:ni, nj = i + di, j + djif 0 <= ni < h and 0 <= nj < w and a[ni, nj] == 0:# 使用正确的变量名thresholdif abs(int(srclmg[ni, nj]) - int(srclmg[i, j])) <= threshold:a[ni, nj] = 255queue.append((ni, nj))# 提取感兴趣区域并显示结果
result = cv2.bitwise_and(srclmg, srclmg, mask=a)plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.imshow(srclmg, cmap='gray')
plt.title('Original Image')plt.subplot(1, 2, 2)
plt.imshow(result, cmap='gray')
plt.title('Segmented Brain Region')
plt.show()

结果:
在这里插入图片描述

在这里插入图片描述

四、本次作业中出现的问题及心得

通过本次实验,我深刻认识到算法实现中细节把控与参数调优的重要性。

http://www.xdnf.cn/news/500815.html

相关文章:

  • MySQL 中 JOIN 和子查询的区别与使用场景
  • 基于 Leaflet 地图库的强大线条、多边形、圆形、矩形等绘制插件Leaflet-Geoman
  • [强化学习的数学原理—赵世钰老师]学习笔记02-贝尔曼方程
  • 《算法导论(第4版)》阅读笔记:p82-p82
  • 如何免费在线PDF转换成Excel
  • Java并发编程的挑战:从理论到实战
  • 题单:汉诺塔问题
  • 使用Langfuse和RAGAS,搭建高可靠RAG应用
  • ctfshow——web入门254~258
  • JavaScript入门【2】语法基础
  • webpack 学习
  • 并发学习之synchronized,JVM内存图,线程基础知识
  • 【双指针】缺失的第一个正整数
  • Visual Studio2022跨平台Avalonia开发搭建
  • 混合学习:Bagging与Boosting的深度解析与实践指南
  • 系统架构设计(七):数据流图
  • 售前工作.工作流程和工具
  • 从专家编码到神经网络学习:DTM 的符号操作新范式
  • tp5 关键词搜索商品时进行关键词拆分
  • Slidev集成Chart.js:专业数据可视化演示文稿优化指南
  • 黄点追踪是什么?:揭秘打印机隐形识别机制的技术分析
  • windows编写和调试代码工具——IDE安装
  • QMK 宏(Macros)功能详解(实战部分)
  • muduo库TcpConnection模块详解——C++
  • CMake基础及操作笔记
  • C语言—再学习(结构体)
  • 【springcloud学习(dalston.sr1)】Zuul路由访问映射规则配置及使用(含源代码)(十二)
  • 玩转 AI · 思考过程可视化
  • 【gitee 初学者矿建仓库】
  • 【Ragflow】22.RagflowPlus(v0.3.0):用户会话管理/文件类型拓展/诸多优化更新