一、实验目的
培养利用图像处理技术解决实际问题的能力。
培养利用图像处理技术综合设计实现的能力。
掌握在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 + dj
if 0 <= ni < h and 0 <= nj < w and a[ni, nj] == 0:
# 使用正确的变量名threshold
if abs(int(srclmg[ni, nj]) - int(srclmg[i, j])) <= threshold:
a[ni, nj] = 255
queue.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()
结果:
四、本次作业中出现的问题及心得
通过本次实验,我深刻认识到算法实现中细节把控与参数调优的重要性。