19 Feb 2010

matlab矩形相交合并函数



问题:
有一N*4的矩形列表,其中每行数据表示一个矩形,格式为[x,y,w,h],依次是矩形左上角的x坐标,y坐标和矩形的宽w和高h.找到这些矩形中的相交矩形,并将小矩形合并入大矩形,如果同一矩形和多个矩形相交,用相交部分的面积除以矩形的面积求得一个比值,优先合并比值最大的两个矩形.最后的输出结果是一个矩形列表,其中的矩形两两都不相交.

分析见http://goo.gl/90FW.

整个问题起初困扰了我好一阵时间,因为考虑的很细,感觉需要考虑的东西很多,矩阵的东西跟着下标转来转去都转晕乎了.后来索性推倒重来,找张白纸,用笔写出伪代码,发现写下来并没有考虑的那么复杂.


function outRectList = rectMerge(inRectList)

1) 设置合并阀值tRatio, 并令outRectList = inRectList.

2) 计算最小面积矩阵matMinArea,并转化为严格上三角矩阵(其实是除了严格上三角,其他位置置1,因为要后面做除法,0不能做除数),其中(i,j)(j>i)的值是inRectList(i)和inRectList(j)这2个矩阵面积中较小的面积值.

3) 计算相交面积矩阵matAreaInt,并转化为严格上三角矩阵,其中(i,j)(j>i)的值是inRectList(i)和inRectList(j)这2个矩阵相交的面积,其他位置都为0.

4) 计算相交比值矩阵matRatio,就是用matAreaInt点除matMinArea,这样得到一个严格上三角矩阵;然后用tRatio这个阀值来判定,如果小于阀值,置0,否则保留原值.

5) 如果matRatio的元素不全为0,设置循环标志intFlag=1,否则intFlag=0.

6) while intFlag,开始循环

7) 寻找matRatio这个矩阵中的最大值,并得到其横,纵坐标i,j,这就是即将合并的矩阵序号.

8) 根据i和j,更新outRectList.具体为:去outRectList里面查找这2个矩形的面积,将面积小的矩形合并到面积大的矩形(合并法则为原面积大的矩形变大到包含原2个矩形,原小矩形从矩形列表中删除.

9) 针对新的outRectList,重新计算matMinArea,matAreaInt,matRatio.

10) 根据新的matRatio设置循环标志intFlag,进入下次循环.

end

No comments :

Post a Comment