一、题目分析
分裂合并方法通过初始分割和相似性度量,逐步合并具有相似特征的区域,直到满足停止条件。分裂合并方法能够处理多个不连续目标的图像,但对于大规模图像或复杂场景可能需要更多的计算资源。
二、系统功能设计
(1) 输入模块:
- 接收待分割的图像数据。
(2) 基于分裂合并的图像分割算法核心:
- 进行图像读取和预处理;
- 实现分裂合并算法,对图像进行分割操作;
- 进行基于分裂合并的图像分割处理,并将处理结果输出出来。
(3) 输出模块:
- 将处理结果最后输出到指定的文件夹中。
三、详细设计
该算法包含以下实现:
- 图像预处理模块
- 分裂合并算法模块
- 图像预处理模块
输入:待处理的图像
输出:预处理后的图像
该模块用于预处理待处理的图像,以便后续的分裂合并操作。具体实现如下:
使用OpenCV库中的函数读取待处理的图像,并根据需求进行灰度转换等操作。
- 分裂合并算法模块
输入:预处理后的图像
输出:分割后的图像
该模块通过将图像分割为多个区域,并通过对区域进行合并或分裂操作达到图像分割的效果。具体实现如下:
- 输入一张待分割的图像,将其表示为一个二维矩阵,并将该矩阵划分为格子;
- 初始化分割表,将每个格子看成一个单独的区域,将区域编码存储到分割表中;
- 对每个区域(类型)进行遍历操作,对相邻且相似的区域进行合并,对不满足条件的区域进行分裂;
- 当合并或分裂操作无法再继续时,将矩阵切分为多个不同的子矩阵,并递归地执行分裂、合并操作,直到达到预定的目标;
- 输出分割后的图像。
基于分裂合并的图像分割算法:该算法通过判断区域均值和样本标准差,是否满足预设条件,对图像进行不断分裂或合并,达到最终的图像分割效果。算法的优点在于较好的适应性和鲁棒性,缺点则在于运算速度较慢。
四、功能测试
功能测试旨在验证代码是否按预期执行并满足指定的要求。本文选取了该图片(分辨率:481×321)作为本文测试的测试用例。
![]() |
测试目标为代码能否正确地分割和合并指定的图像,以下是执行代码后所得的分割图像。
![]() |
代码能成功分割和合并指定的图像,生成分割后的图像文件。同时代码执行过程中没有出现任何错误或异常。
五、性能测试
本文选择测量代码对图像分割和合并所需要的时间和内存使用情况。
- 处理时间:代码成功地在0.98秒内完成了对输入图像的分割和合并操作。这表明代码具有较高的执行效率,并能够在较短的时间内处理图像。根据不同大小的输入图像,代码的处理时间可能会有所变化。
- 内存使用峰值:在图像分割和合并过程中,代码的内存使用峰值为88.02 MB。这表明代码在内存资源的利用方面表现出良好的效果,没有出现过度的内存消耗。代码的内存使用情况符合预期,不会引起性能问题或系统不稳定。
综上所述,基于给定的测试结果,代码展现了高效的处理速度和适当的内存管理能力,适用于对图像进行分割和合并的任务。这些性能特征为代码的实际应用提供了良好的基础。
六、完整代码
import os
import cv2 as cv
import numpy as np
# 合并分裂
# 判断是否需要继续分割
def Division_Judge(img, h0, w0, h, w):
area = img[h0:h0+h, w0:w0+w]
mean = np.mean(area)
std = np.std(area, ddof=1)
total_points = 0
operated_points = 0
for row in range(area.shape[0]):
for col in range(area.shape[1]):
if (area[row][col] - mean) < 2 * std:
operated_points += 1
total_points += 1
if operated_points / total_points >= 0.95:
return True
else:
return False
# 合并像素
def Merge(img, h0, w0, h, w):
for row in range(h0, h0+h):
for col in range(w0, w0+w):
if img[row, col] > 100 and img[row, col] < 200:
img[row, col] = 0
else:
img[row, col] = 255
# 递归处理
def Recursion(img, h0, w0, h, w):
if not Division_Judge(img, h0, w0, h, w) and min(h, w) > 5:
Recursion(img, h0, w0, int(h/2), int(w/2))
Recursion(img, h0, w0+int(w/2), int(h/2), int(w/2))
Recursion(img, h0+int(h/2), w0, int(h/2), int(w/2))
Recursion(img, h0+int(h/2), w0+int(w/2), int(h/2), int(w/2))
else:
Merge(img, h0, w0, h, w)
# 图片分割处理
def Division_Merge_Segmented(file_path, save_folder_path):
# 读取图片
img = cv.imread(file_path, cv.IMREAD_GRAYSCALE)
# 分割图片
Recursion(img, 0, 0, img.shape[0], img.shape[1])
# 删除空白区域
img = img[1:-1, 1:-1] # 删除边缘
# 保存分割后的图片
file_name = os.path.basename(file_path)
new_file_path = os.path.join(save_folder_path, "split_merger_" + file_name)
cv.imwrite(new_file_path, img, [cv.IMWRITE_PNG_COMPRESSION, 0])
# 获取指定目录下的所有图片文件路径列表
def get_image_files(path):
files = os.listdir(path)
image_files = []
for file in files:
full_path = os.path.join(path, file)
if os.path.splitext(full_path)[-1].lower() in ['.jpg', '.jpeg', '.png', '.bmp']:
image_files.append(full_path)
return image_files
if __name__ == "__main__":
# 指定要处理的文件夹路径
folder_path = " "
# 分割后的图片保存到这个目录中
save_folder_path = " "
if not os.path.exists(save_folder_path):
os.mkdir(save_folder_path)
# 获取所有图片文件的路径
image_files = get_image_files(folder_path)
# 对每个图片文件进行分割处理
for file_path in image_files:
Division_Merge_Segmented(file_path, save_folder_path)
print("Done")