pse

思路:

首先在队列中放入第一个kernel是s1中的所有待扩展的点,即对于s1中的所有文本区域的lebel,然后由下一个给出的s2计算所有扩展,直到队列中所有点扩展完毕,将扩展后的边界加入下一个队列,直到所有核加入完毕

import numpy as np
import cv2
from queue import Queue
#第一次将所有核区域内的像素进行扩张,下一次开始都是从边界开始扩张
def pse(kernels,min_area):
    #核的数量
    kernel_num=len(kernels)

    pred=np.zeros(kernels[0].shape,dtype='int32')

    label_num,label=cv2.connectedComponents(kernels[kernel_num-1],connectivity=4)#4连通
    #输入图像比须是二值图像
    #num_labels:所有连通域的数目
    #labels:图像上每一像素的标记,用数字1、2、3…表示(不同的数字表示不同的连通域)0表示背景
    #先处理最后一幅图
    for label_idx in range(1,label_num):
        #枚举标记,从label:1开始处理
        #计算像素个数,少于min_area个数的不算
        if np.sum(label==label_idx)<min_area:
            label[label==label_idx]=0
        #队列为空
    queue=Queue(maxsize=0)
    next_queue=Queue(maxsize=0)
    #[2,20],20个像素位置label是>0
    points=np.array(np.where(label>0)).transpose((1,0))
    #[10234,2]所有连通域内的点
    for point_idx in range(points.shape[0]):
        x,y=points[point_idx,0],points[point_idx,1]
        l=label[x,y]
        queue.put((x,y,l))#初始化扩张点
        pred[x,y]=l#基于s1初始化预测结果pred
    #pred中存放[x,y]中的label,表示当前区域已经扩充为l
    #queue中存放的是[x,y,label]
    dx=[-1,1,0,0]
    dy=[0,0,-1,1]
    #7 [5 4 3 2 1 0]
    for kernel_idx in range(kernel_num-2,-1,-1):#从倒数第二个往前枚举
        #取出核,从上一个kernel即queue里存的值往当前kernel扩充
        kernel=kernels[kernel_idx].copy()#s2..sn
        while not queue.empty():
            (x,y,l)=queue.get()

            is_edge=True
            for j in range(4):
                tempx=x+dx[j]
                tempy=y+dy[j]
                if tempx<0 or tempx>=kernel.shape[0] or tempy<0 or tempy>=kernel.shape[1]:
                    continue
                if kernel[tempx,tempy]==0 or pred[tempx,tempy]>0:
                    continue

                queue.put((tempx,tempy,l))#扩张的点也需要继续判断是否还需要扩张
                pred[tempx,tempy]=l
                is_edge=False
            if is_edge:#当前仅当不需要扩张,已到达边界,进入下一个kernel去判断
                next_queue.put((x,y,l))

        queue,next_queue=next_queue,queue

    return pred
        
'''a=np.array([[0,0,0,0],
            [0,1,1,0],
            [0,1,1,0],
            [0,0,0,0]])
points=np.array(np.where(a>0)).transpose((1,0))
print(points)'''
#[[1 1]
# [1 2]
# [2 1]
# [2 2]]
#kernel_num=4#[0,1,2,3]
#for t in range(kernel_num-2,-1,-1):
#    print(t)
#2,1,0
posted @ 2021-12-14 22:20  Tsukinousag1  阅读(933)  评论(0)    收藏  举报