CFS连通域分割法

该博客主要介绍了两种图像处理技术:连通域分割(CFS)和垂直投影。CFS用于去除二值化图像中的噪点,通过遍历像素并使用队列实现连通区域的标记和分割。垂直投影则通过统计每一列黑色像素的数量,找出连续的黑色区域,用于检测图像的边界。这两个方法对于图像分析和分割具有重要意义。
摘要由CSDN通过智能技术生成
import queue
import cv2
from PIL import Image

def cfs(img):
    """传入二值化后的图片进行连通域分割"""
    pixdata = img.load()
    w,h = img.size
    visited = set()
    q = queue.Queue()
    offset = [(-1,-1),(0,-1),(1,-1),(-1,0),(1,0),(-1,1),(0,1),(1,1)]
    cuts = []
    for x in range(w):
        for y in range(h):
            x_axis = []
            y_axis = []
            if pixdata[x,y] == 0 and (x,y) not in visited:
                q.put((x,y))
                visited.add((x,y))
            while not q.empty():
                x_p,y_p = q.get()
                for x_offset,y_offset in offset:
                    x_c,y_c = x_p+x_offset,y_p+y_offset
                    if (x_c,y_c) in visited:
                        continue
                    visited.add((x_c,y_c))
                    try:
                        if pixdata[x_c,y_c] == 0:
                            q.put((x_c,y_c))
                            x_axis.append(x_c)
                            y_axis.append(y_c)
                    except:
                        pass
            if x_axis:
                min_x,max_x = min(x_axis),max(x_axis)
                if max_x - min_x >  3:
                    # 宽度小于3的认为是噪点,根据需要修改
                    cuts.append((min_x,max_x))
    return cuts

def vertical(img):
    """传入二值化后的图片进行垂直投影"""
    pixdata = img.load()
    w,h = img.size
    ver_list = []
    # 开始投影
    for x in range(w):
        black = 0
        for y in range(h):
            if pixdata[x,y] == 0:
                black += 1
        ver_list.append(black)
    # 判断边界
    l,r = 0,0
    flag = False
    cuts = []
    for i,count in enumerate(ver_list):
        # 阈值这里为0
        if flag is False and count > 0:
            l = i
            flag = True
        if flag and count == 0:
            r = i-1
            flag = False
            cuts.append((l,r))
    return cuts


if __name__ == '__main__':
    # img = cv2.imread("two\\tt15.jpg")
    img = Image.open("two\\tt15.jpg")
    cuts = cfs(img)
    print("cfs:",cuts)
    # for i, n in enumerate(cuts, 1):
    #     temp = img.crop(n)  # 调用crop函数进行切割
    #     temp.save("results//cut%s.jpg" % i)

    # b_img = binarizing(b_img, 200)
    v = vertical(img)
    print("vertical:",v)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值