师兄给了个任务,让我用matlab处理图片。主要内容大概是,已有一个程序,能够把读入图片中的物体用box框出来。我要做的是用正方形把box所在区域抠出来,中心点不变,边长为box矩形的最长边h,加最长边h的1/16padding。简单说是把box框出的物体用最小外接正方形抠出来输出单个图片。一种格式是原始图片,一种格式是图片中含有box框框。另外在统计box长宽的数目做出直方图。
这样就有了三个矩阵,分别对应RGB的值。
任务不算复杂,但我没用过matlab,安装包都没有,做起来还是要花些时间,毕竟装个matlab 2014a破解版都要一两个小时了。
重点说下我做图像处理时用的的几个函数。
imread 读入图片后把数据保存为三维矩阵[m*n*z] m是原始图片的高,n为长,z为3,分别代表RGB的值。如I=imread('a.jpg');
size函数能获得矩阵的大小。如[m n] = size(I); 这里的n为图片原始长度的3倍。为什么,因为I是三维矩阵呀,,我几次都忽略了这点,出了许多bug。最好写成[m n z] = size(I)。这样就不会出错了
接下来对图像做什么处理,就直接去整这个三维矩阵就好了。
imshow(I) 这样一句话,就能把三维图像矩阵显示到figure上了。在对三维矩阵一整处理后,不知道把图像变成什么样了,只需要imshow(I)一下,就能够看到了。
如果你用了imshow之后看到的图像为白色,那恭喜你也和我一样中招了。
在matlab中,imshow处理的是
uint8类型的数据。范围是[0~1]。imread 也一样,读入的是uint8类型,为了保证精度,转换成了double类型存储了矩阵,范围是[0~255]。所以我们在对矩阵操作是,处理的都是double类型的数据。当要用到imshow时,要把double类型转换为uint8类型作为输入,才能正常显示图像。imwrite函数同理。
解决办法:
imshow(I/256); %将图像矩阵转化到0-1之间
imshow(I,[]); %自动调整数据的范围以便于显示
或者直接用im2uint8函数
我用的是第一种方法,其他还没试过。
再说下我对三维矩阵做了哪些处理。首先我把三维矩阵拆成了三个二维矩阵,方便处理。用的cat函数
c1 = cat(2, I(:,:,1));
c2 = cat(2, I(:,:,2));
c3 = cat(2, I(:,:,3));
然后我要在图中画一个框怎么做呢?
比如一个框框的坐标存在了bb一维四列数组中:
xmin = bb(1)
ymin = bb(2)
xmax = bb(3)
ymax = bb(4)
我在图片中相应的位置,画一个绿色的框:
c1(bb(2), bb(1):bb(3)) = 0;
c1(bb(4), bb(1):bb(3)) = 0;
c1(bb(2):bb(4), bb(1)) = 0;
c1(bb(2):bb(4), bb(3)) = 0;
c2(bb(2), bb(1):bb(3)) = 255;
c2(bb(4), bb(1):bb(3)) = 255;
c2(bb(2):bb(4), bb(1)) = 255;
c2(bb(2):bb(4), bb(3)) = 255;