人群密度图的生成(MATLAB+malldataset)

首先malldataset数据集下载

参见人群密度估计之MCNN写的关于密度图的生成,在MATLAB跑了程序,代码如下:

clear; 
 %透视变换的系数 
load('perspective_roi.mat'); 
%ground truth 
load('mall_gt.mat');  

m=480;n=640;  
m=m/4;  
n=n/4;  
mask = imresize(roi.mask,0.25);  %图像缩小4for i=1:2000  %2000幅图像
   gt = frame{i}.loc; %第一个frame结构体的loc字段 
   gt = gt/4;  
   d_map = zeros(m,n);  
   for j=1:size(gt,1)
   %设置高斯滤波的参数  
       ksize = ceil(25/sqrt(pMapN(floor(gt(j,2)),1))); 
       ksize = max(ksize,7);  
       ksize = min(ksize,25);  
       radius = ceil(ksize/2);  
       sigma = ksize/2.5;  
       h = fspecial('gaussian',ksize,sigma);  
       x_ = max(1,floor(gt(j,1)));  
       y_ = max(1,floor(gt(j,2)));  
 %对边缘点进行处理 
       if (x_-radius+1<1)  
              for ra = 0:radius-x_-1  
                   h(:,end-ra) = h(:,end-ra)+h(:,1);  
                   h(:,1)=[];  
              end  
       end  
       if (y_-radius+1<1)  
           for ra = 0:radius-y_-1  
               h(end-ra,:) = h(end-ra,:)+h(1,:);  
               h(1,:)=[];  
           end  
       end  
      if (y_-radius+1<1)  
           for ra = 0:radius-y_-1  
               h(end-ra,:) = h(end-ra,:)+h(1,:);  
               h(1,:)=[];  
           end  
       end  
       if (x_+ksize-radius>n)  
           for ra = 0:x_+ksize-radius-n-1  
               h (:,1+ra) = h(:,1+ra)+h(:,end);  
               h(:,end) = [];  
           end  
       end  
       if(y_+ksize-radius>m)  
            for ra = 0:y_+ksize-radius-m-1  
                h (1+ra,:) = h(1+ra,:)+h(end,:);  
                h(end,:) = [];  
            end  
       end  
          d_map(max(y_-radius+1,1):min(y_+ksize-radius,m),max(x_-radius+1,1):min(x_+ksize-radius,n))...  
             = d_map(max(y_-radius+1,1):min(y_+ksize-radius,m),max(x_-radius+1,1):min(x_+ksize-radius,n))...  
              + h;  
   end  
 map0_255 = Normalize(d_map) 
% %方法1,保存为图片,再转为LMDB  
% %把数组A中的数转换成字符串表示形式
str=num2str(i,'./density/seq_%06d.jpg');  
%imwrite(d_map,str);  
 imshow( map0_255);  
%方法2,直接转为HDF5  
%  trainLabels=permute(d_map,[2 1]);  
%  str=num2str(i,'./density_map/seq_%06d.h5');  
%   h5create(str,'/label',size(trainLabels),'Datatype','double');  
%   h5write(str,'/label',trainLabels);  

end  

最后得到的图像规到0-255后输出为:
这里写图片描述
而d_map中的数据大致是,d_map是0-1之间的数值
这里写图片描述
对d_map中的数值分析可以得知,就算归到0-255,数值依然很小,所以,成黑白状态。

说明:在pMapN中存的是透视变化的加权值,Roi表示在图像中定义的ROI区域,mask掩码可以实现只对ROI区域操作。

博主在跑程序的时候,把密度图生成为.jpg的格式,然后再用matlab去读它,发现:数据大小变了,本来应该是0-1之间的数值的,在读进来的话,一般为0-100,且变化没有规律,大致是因为window的格式,jpg本身就是压缩的图,但是奇怪的是bmp格式几乎也是一样的。如果有哪位大神也发现了并找到解决的方法,求指教。

猜你喜欢

转载自blog.csdn.net/snwang_miss/article/details/77854633