基于分裂合并的图像分割

本文介绍了采用分裂合并方法进行图像分割的系统设计,包括输入输出模块以及核心的图像预处理和分裂合并算法。通过OpenCV库进行图像处理,算法通过判断区域均值和标准差来决定分裂或合并。在功能测试中,代码成功分割和合并图像,执行时间为0.98秒,内存峰值为88.02MB,显示出高效和良好的内存管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目分析

        分裂合并方法通过初始分割和相似性度量,逐步合并具有相似特征的区域,直到满足停止条件。分裂合并方法能够处理多个不连续目标的图像,但对于大规模图像或复杂场景可能需要更多的计算资源。

二、系统功能设计

(1) 输入模块:

  • 接收待分割的图像数据。

(2) 基于分裂合并的图像分割算法核心:

  • 进行图像读取和预处理;
  • 实现分裂合并算法,对图像进行分割操作;
  • 进行基于分裂合并的图像分割处理,并将处理结果输出出来。

(3) 输出模块:

  • 将处理结果最后输出到指定的文件夹中。

三、详细设计

该算法包含以下实现:

  • 图像预处理模块
  • 分裂合并算法模块
  1. 图像预处理模块

                输入:待处理的图像

                输出:预处理后的图像

        该模块用于预处理待处理的图像,以便后续的分裂合并操作。具体实现如下:

        使用OpenCV库中的函数读取待处理的图像,并根据需求进行灰度转换等操作。

  1. 分裂合并算法模块

                输入:预处理后的图像

                输出:分割后的图像

        该模块通过将图像分割为多个区域,并通过对区域进行合并或分裂操作达到图像分割的效果。具体实现如下:

  1. 输入一张待分割的图像,将其表示为一个二维矩阵,并将该矩阵划分为格子;
  2. 初始化分割表,将每个格子看成一个单独的区域,将区域编码存储到分割表中;
  3. 对每个区域(类型)进行遍历操作,对相邻且相似的区域进行合并,对不满足条件的区域进行分裂;
  4. 当合并或分裂操作无法再继续时,将矩阵切分为多个不同的子矩阵,并递归地执行分裂、合并操作,直到达到预定的目标;
  5. 输出分割后的图像。

        基于分裂合并的图像分割算法:该算法通过判断区域均值和样本标准差,是否满足预设条件,对图像进行不断分裂或合并,达到最终的图像分割效果。算法的优点在于较好的适应性和鲁棒性,缺点则在于运算速度较慢。

四、功能测试


        功能测试旨在验证代码是否按预期执行并满足指定的要求。本文选取了该图片(分辨率: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")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值