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

浙公网安备 33010602011771号