【youcans 的 OpenCV 例程200篇】169.图像分割之区域分离

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中


【youcans 的 OpenCV 例程200篇】169.图像分割之区域分离


### 4.2 区域分离与聚合

区域分裂合并算法的基本思想是将图像细分为一组不相交的区域,然后聚合或者分离这些区域。

分离和聚合的判据是用户选择的谓词逻辑 Q,通常是目标区域特征一致性的测度,例如灰度均值和方差。

分离过程先判断当前区域是否满足目标的特征测度,如果不满足则将当前区域分离为多个子区域进行判断;不断重复判断、分离,直到拆分到最小区域为止。典型的区域分裂方法,是将区域按照 4 个象限分裂为 4 个子区域,可以简化处理和运算过程。

区域分离的分割结果通常包含具有相同性质的邻接区域,通过聚合可以解决这个问题。仅当邻接区域的并集满足目标的特征测度,才将进行聚合。

区域分离与聚合基本方案的过程如下:
(1)区域分离:把所有满足条件 Q ( R i ) = F a l s e Q(R_i)=False Q(Ri)=False 的区域 R i R_i Ri 等分为 4 个子区域,不断拆分直到最小单元;
(2)区域聚合:把所有满足条件 Q ( R j ∪ R k ) = T r u e Q(R_j \cup R_k)= True Q(RjRk)=True 的相邻区域 R j , R k R_j, R_k Rj,Rk 聚合。


例程 11.26:图像分割之区域分离

    # 11.26 图像分割之区域分离
    def SplitMerge(src, dst, h, w, h0, w0, maxMean, minVar, cell=4):
        win = src[h0: h0+h, w0: w0+w]
        mean = np.mean(win)  # 窗口区域的均值
        var = np.std(win, ddof=1)  # 窗口区域的标准差,无偏样本标准差

        if (mean<maxMean) and (var>minVar) and (h<2*cell) and (w<2*cell):
            # 该区域满足谓词逻辑条件,判为目标区域,设为白色
            dst[h0:h0+h, w0:w0+w] = 255  # 白色
            # print("h0={}, w0={}, h={}, w={}, mean={:.2f}, var={:.2f}".
            #       format(h0, w0, h, w, mean, var))
        else:  # 该区域不满足谓词逻辑条件
            if (h>cell) and (w>cell):  # 区域能否继续分拆?继续拆
                SplitMerge(src, dst, (h+1)//2, (w+1)//2, h0, w0, maxMean, minVar, cell)
                SplitMerge(src, dst, (h+1)//2, (w+1)//2, h0, w0+(w+1)//2,  maxMean, minVar, cell)
                SplitMerge(src, dst, (h+1)//2, (w+1)//2, h0+(h+1)//2, w0, maxMean, minVar, cell)
                SplitMerge(src, dst, (h+1)//2, (w+1)//2, h0+(h+1)//2, w0+(w+1)//2, maxMean, minVar, cell)
            # else:  # 不能再分拆,判为非目标区域,设为黑色
            #     src[h0:h0+h, w0:w0+w] = 0  # 黑色

    img = cv2.imread("../images/Fig0938a.tif", flags=0)
    hImg, wImg = img.shape
    mean = np.mean(img)  # 窗口区域的均值
    var = np.std(img, ddof=1)  # 窗口区域的标准差,无偏样本标准差
    print("h={}, w={}, mean={:.2f}, var={:.2f}".format(hImg, wImg, mean, var))

    maxMean = 80  # 均值上界
    minVar = 10  # 标准差下界
    src = img.copy()
    dst1 = np.zeros_like(img)
    dst2 = np.zeros_like(img)
    dst3 = np.zeros_like(img)
    SplitMerge(src, dst1, hImg, wImg, 0, 0, maxMean, minVar, cell=32)  # 最小分割区域 cell=32
    SplitMerge(src, dst2, hImg, wImg, 0, 0, maxMean, minVar, cell=16)  # 最小分割区域 cell=16
    SplitMerge(src, dst3, hImg, wImg, 0, 0, maxMean, minVar, cell=8)  # 最小分割区域 cell=8

    plt.figure(figsize=(9, 7))
    plt.subplot(221), plt.axis('off'), plt.title("Origin")
    plt.imshow(img, 'gray')
    plt.subplot(222), plt.axis('off'), plt.title("Region split (c=32)")
    plt.imshow(dst1, 'gray')
    plt.subplot(223), plt.axis('off'), plt.title("Region split (c=16)")
    plt.imshow(dst2, 'gray')
    plt.subplot(224), plt.axis('off'), plt.title("Region split (c=8)")
    plt.imshow(dst3, 'gray')
    plt.tight_layout()
    plt.show()

【youcans 的 OpenCV 例程200篇】169.图像分割之区域分离_第1张图片


(本节完)


版权声明:

youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124496034)

Copyright 2022 youcans, XUPT
Crated:2022-4-30


欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中

【youcans 的 OpenCV 例程200篇】168.图像分割之区域生长
【youcans 的 OpenCV 例程200篇】169.图像分割之区域分离
【youcans 的 OpenCV 例程200篇】170.图像分割之K均值聚类
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】

你可能感兴趣的:(opencv,python,图像处理,计算机视觉,算法)