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
最后把满足条件的正方形输出成图片,当然,正方形超出原始图片的部分也是补零,可以套用上个程序的方法。
用上个程序,统计所有正方形的边长,画出直方图,
根据这个概率分布,随机生成一个边长,再随机在图片中生成一个中心点的位置,画出一个正方形。
计算这个正方形和所有标记框的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
最后把满足条件的正方形输出成图片,当然,正方形超出原始图片的部分也是补零,可以套用上个程序的方法。
相关文章推荐
- 梯度下降算法(Gradient descent)
- 如何制作装机启动盘及重装系统; 如何利用百度云盘下载MATLAB等资料软件 ;如何安装镜像ISO文件
- matlab绘制图形
- matlab 扩大虚拟内存
- MATLAB图像增强程序
- 关于matlab的gui中调获取axes里data cursor的坐标位置
- Matlab用代码关联m文件
- Matlab应用实例(10)—fzero和fsolve解非线性方程(组)
- Matlab应用实例(9)—A\b解线性方程组
- 64位Mex文件在Matlab 2014b和Visual Studio 2013中的调试
- matlab学习笔记(一)单元数组
- matlab 中atan2函数的介绍
- matlab如何实现循环提取EXCEL一列数据
- Matlab基于学习------------------函数微分学
- matlab相关操作笔记
- 关于MATLAB中的tic toc的问题
- Matlab中sort函数的使用
- 笔记2 MATLAB图像处理一
- MATLAB 复制文件
- Matlab中@与函数调用