第八章 图像分割
大约 3 分钟数字图像处理数字图像处理
翻到教材234面,完成实验五:图像分割
实验目的和要求
- 理解图像分割的目的和思想
- 理解并掌握灰度图像分割的几种经典方法
- 理解影响灰度图像分割的因素以相关解决方法
1. 图像分割实验
前言
实验内容
1. 阅读并完善程序,要求采用迭代算法获得阈值,并进行图像阈值分割,效果如实验图14所示。

示例代码如下,注意空白代码区域,需要你自己补充 👇
# 迭代法求阈值
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像(改为绝对路径更可靠)
img = cv2.imread(r'./img/paopao.jpg', 0)
# 图像预处理:将BGR转换为RGB以便matplotlib正确显示
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 初始化变量
G1 = np.zeros(img.shape, np.uint8) # 存储低于阈值的部分
G2 = np.zeros(img.shape, np.uint8) # 存储高于阈值的部分
T1 = np.mean(img) # 初始阈值为图像平均灰度
diff = 255 # 初始阈值差异
T0 = 0.01 # 最小阈值差异阈值
# 迭代过程
while diff > T0:
# 双阈值分割(反向操作)
_, G1 = cv2.threshold(img, T1, 255, cv2.THRESH_TOZERO_INV)
_, G2 = cv2.threshold(img, T1, 255, cv2.THRESH_TOZERO)
# 计算非零区域的平均灰度
loc1 = np.where(G1 > 0.001)
loc2 = 这里填什么?
# 安全计算均值(避免空数组)
ave1 = np.mean(img[loc1]) if len(loc1[0]) > 0 else 0
ave2 = 这里填什么?
# 更新阈值
T2 = 这里填什么?
diff = 这里填什么?
# 准备下一次迭代
T1 = T2
# 最终二值化结果
_, img_result = cv2.threshold(img, T1, 255, cv2.THRESH_BINARY)
# ========== 可视化结果 ==========
plt.figure(figsize=(15, 10))
# 1. 原始图像
plt.subplot(1, 2, 1)
plt.imshow(img_rgb)
plt.title('Original Image')
plt.axis('off')
# 2. 阈值分割结果
plt.subplot(1, 2, 2)
plt.imshow(img_result, cmap='gray')
plt.title(f'Binary Result (T={T1:.2f})')
plt.axis('off')2. 噪声会影响图像分割的效果,一个简单的处理方法是对含噪图像先进行平滑滤游再进行分制。编程先给输入图像添加高斯噪声,然后对图像进行平滑后,再用OTSU算法对图像进行國值分割,比较图像平滑和没有平滑的图像分割效果,程序运行效果如实验图所示。
提示:
(1)添加噪声的代码:
img_noisy = np.uint8(img+0.8*img.std()* np.random.standard_normal(img.shape))(2) 计算直方图函数:
def histogram(image):
(row, col) = image.shape
#创建长度为256的list
hist = [0]*256
for i in range(row):
for j in range(col):
hist[image[i,j]] += 1
return hist
3. 使用 OpenCV 工具包中的 adaptiveThreshold()函数对实验图 16a进行自适应阈值分割调整参数,实现较好的分割效果,

注意: 实验中要用到的资源 学习通的 第二种资源 文件夹下的 img包下面有,参考代码,在线讲义中有
