1.基于亚像素的图像矢量化方法,包括以下步骤:
步骤1、首先使用基于L0梯度最小化方法对输入图像进行分割,得到分割图像Is,记w、h分别为分割图像Is的宽和高;
步骤2、创建一幅宽为w+1,高为2h+1的图像,每个像素存放的是图像的所有像素边界,偶数行存放的水平的边界,通过比较上下两个像素颜色是否相等判断,奇数行存放的是垂直的边界,通过比较左右两个像素颜色是否相等判断;因为每一行垂直的边界个数比水平的边界个数多一个,所以偶数行最后一个像素并没有任何意义;如果是边界点,则将像素置位255,否则为0;
步骤3、找到输入图像中边界的拐点;这些拐点定义为像素点周围存在三条以及更多边界的点,通过遍历图像判断当前像素点周围有几条边界得到,如果周围有三条及三条以上边界,则将其设置为绿色,表示拐点;然后再次遍历边界图,找到任何两个拐点之间的序列化边界;将得到的所有的序列化边界存入到序列化边界集合C_border中;
步骤4、使用种子填充方法得到图像的分割区域,为这些区域依次编号,并将它们放入到集合R中,遍历集合R中的区域,依次判断C_border中的边界是否与R相邻,若相邻,则将该边界添加到相应区域的容器中,来表示每个区域所相邻的边界集合;通过使用一个二维数组来保存区域相对应的边界,一维表示的是区域编号,二维保存的是每个区域相邻的边界序号;然后通过判断同一区域所有边界端点的邻接关系来为这些序列化边界排序;
步骤5、计算每条边界的spline样条曲线方程,将spline样条曲线存入集合S;使用的是三次样条曲线,在计算曲线的同时考虑边界斜率,从而保证两条样条连接处的平滑性;
B(t)=Y0(1-t)3+3(K1(x1-X0)+Y0)t(1-t)2+3(K2(x2-X3)+Y3)t2(1-t)+Y3t3,t∈[0,1] (1)其中,P0、P1、P2、P3分别表示曲线的起点、控制点、控制点、终点;t的取值范围是0到1之间,B是关于t的样条曲线方程,(X0,Y0)和(X3,Y3)表示两个端点坐标,K1和K2分别表示起点到第一个控制点,终点到第二个控制点的直线的斜率;x1和x2分别表示两个控制点的x坐标;步骤如下:假设有两条边界b1和b2,为了保证连接处的平滑,从b1和b2之间的连接端点出发在b1和b2上分别取4个点,并将中间两个点坐标的平均值 作为中心点,其中,(xa,ya)和(xb,yb)表示第四个点和第五个点的坐标;然后对这9个点使用最小二乘法拟合出样条曲线,这条曲线中点的斜率是b1和b2连接点处的切向,即确定b1的斜率K2。若b1和b2的另一个端点也是非起始点,则采用同样的方法;否则,对于非连接处的点(即起点或终点)取
5个点用最小二乘法拟合曲线,曲线端点的斜率作为端点处的切向,及确定b1的斜率K1。通过以上步骤计算出的斜率,又因为b1是经过起始点的,便可以通过以上公式,使用最小二乘法计算出x1和x2的值,再通过斜率计算出y1和y2,从而确定控制点;
步骤6、在计算完一条曲线的spline同时,会计算原边界曲线与计算产生的spline曲线之间的偏离误差,若误差较大,会在曲率较大的地方插入一个拐点,从而使用两条样条曲线来进行拟合,这时需要使用步骤5中保持连接处曲线平滑的方式来计算spline曲线;然后再次计算误差,直到误差小于指定的阈值;样条计算步骤包括:先用传统的样条计算式(2)对边界进行拟合,B(t)=P0(1-t)3+3P1t(1-t)2+3P2t2(1-t)+P3t3,t∈[0,1] (2)
其中,P0、P1、P2、P3分别表示曲线的端点、控制点、控制点、端点。t的取值范围是0到1之间,B是关于t的样条曲线方程;
若误差较大,则向边界中插入拐点,再采用式(1)的样条计算公式进行计算;若误差还是较大,继续插入拐点,直到误差小于给定的阈值为止;
步骤7、根据区域编号顺序,画出对应的边界曲线,并为每个区域填充对应的平均色。