您的位置:首页 > 编程语言 > MATLAB

matlab图像处理(2)

2015-07-14 16:17 344 查看
师兄又来发任务卡啦,还是一样matlab,对上次的图像做进一步处理。
用上个程序,统计所有正方形的边长,画出直方图,
根据这个概率分布,随机生成一个边长,再随机在图片中生成一个中心点的位置,画出一个正方形。
计算这个正方形和所有标记框的IOU。
按照这种方法,随机生成8个IOU小于20%的正方形图片,和2个IOU小于50%的图片。

IOU是两张图像的交并比。IOU=两张图片重合的面积/两张图片面积之和减重合面积

我把这个任务分为5个步骤:

1.把所有box画在图片上,记录每个box的四个角坐标

2.获得边长数组

3.随机生成一个正方形,随机中心点位置,以边长数据分布情况为概率生成边长。

4.计算生成区域和所有box的交并比

5.画出生成区域

第一步:
套用上个程序中,写好的算法,把所有标记框都画在图上,并把坐标记录在矩阵中。

onebox=[bb(1) bb(2) bb(3) bb(4)];
box=[box;onebox];

这里一行代表一个box,每行有四列,记录box位置信息。

第二步:
也是用上一个程序,获得边长数组

第三步:
随机生成中心点的位置比较简单,用unidrnd(N)函数,生成1到N的随机整数

[irow, icol] = size(I);

centerX = unidrnd(icol/3);
centerY = unidrnd(irow);

一开始忘了icol记录的是原长度的3倍,又测试了好久才发现

根据概率随机生成边长,这我没有想到很好的解决办法,
我队友告诉了我用一个极其简单的处理方式。
首先读入生成好的边长数组

a=textread('train_rec.txt');
yy=a(:,:);
[yy_size, yy_line] = size(yy);

然后随机生成数组下标,该下标对应的数组元素就是要取的边长

index = unidrnd(yy_size);
side = yy(index);

我感觉有那么点道理,但又不完全信服,还没想到别的方法,就有此法先做下去,望有大牛指正。

第四步:
这是我队友写的一个计算IOU的算法

经测试,应该是完备的,贴出来给大家指正。

function result = IOU(input1, input2)
% input = [x1, y1, x2, y2] left down point(x1, y1) and right up point (x2, y2)
if input1(1) < input2(1)
left = input1;
right = input2;
else
left = input2;
right = input1;
end
x = 0;
y = 0;
if left(3) > right(1)
x_buond = min(left(3), right(3));
x = x_buond - right(1);
if left(2) <= right(2)
if (left(4) > right(2))
y_bound = min(left(4),right(4));
y = y_bound - right(2);
end
end
if right(2) <= left(2)
if ( right(4) > left(2) )
y_bound = min(left(4), right(4));
y = y_bound - left(2);
end
end
end
insert = x*y;
total = (left(3)-left(1))*(left(4)-left(2)) + (right(4)-right(2))*(right(3)-right(1)) - insert;
result = insert/total;
end

第5步
计算好IOU,只需要在做些判断就可以输出所要截取的正方形了。
每次随机生成的正方形,和所有的box都计算一次IOU,只有所有的IOU都满足小于20%,才认为这个正方形满足20%的条件。
但是只要有一个box计算得到的IOU小于50%,就认为这个正方形满足50%的条件。

can2 = 1;
can5 = 0;

for kk = 1 : bb_size
input1 = [centerX-side/2 centerY-side/2 centerX+side/2 centerY+side/2];
input2 = [box(kk,1) box(kk,2) box(kk,3) box(kk,4)];
iou = IOU(input1, input2);
% disp(iou);
if(iou <= 0.2)
can5 = 1;
elseif(iou > 0.2 && iou < 0.5)
can2 = 0;
can5 = 1;
else
can2 = 0;
end
end

最后把满足条件的正方形输出成图片,当然,正方形超出原始图片的部分也是补零,可以套用上个程序的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: