你们好,我有一个Matlab图像处理问题想请教
我有个图片,想识别并计算中间水区域的实际面积
我也有个校准图片,其中每一个小格是1mm
但是由于这两个照片都是通过倾斜的镜子反射拍出来的(同一实验台),横向和竖向有变形切程度不一样,据我识别的是横向和竖向每个像素点变形可能大概差两倍
我已经实现了识别这个水的区域、数像素点,现在得到这个水区域的总象数点数,我也实现了通过识别这个校准图片,可以得到每一个像素点对应的实际距离,可是竖向和横向的像素点对应的实际距离不一样。请问我该如何通过这个校准图片来校准竖向和横向的像素点的变形,然后得到真正的处理了变形之后的水的面积?
我的代码如下:
% Get Pixel Size from Calibration Image or load Calibration
var_pixsize=getpixelsize([FileFolder{VidNr},'']);
stc_VID.Info.PixelSize=var_pixsize;
%Preallocation
stc_VID.ImageData=repmat( struct( 'Area',NaN, 'Centroid',[NaN NaN],'Extrema',NaN(8,2),'DropDiameter',NaN,'DropVolume',NaN,'SurfaceSpread',NaN,'SurfaceTouchPts',NaN,'ImpactHeight',NaN),length(images(1,1,:)), 1 ); % Preallocate a struct in which all data is restored
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Loop through all images %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for framenr=1:length(images(1,1,:))
img_BGOrig=(img_BG-images(:,:,framenr)); % Save original image minus background
img_currframe=(img_BG-images(:,:,framenr))>var_bw_thr; % Turn frame into binary image
%img_currframe=imbinarize(img_BG-images(:,:,framenr)); %another way to change to binary
img_currframe=imfill(img_currframe,'holes'); % Fill holes
stc_regprops=regionprops(img_currframe,'Centroid','Area','Extrema','PixelList','BoundingBox','Perimeter'); % REGIONPROPS TO GET IMAGE DATA (get perimeter)
figure(1),imshow(img_currframe);% (Can see the process of the video)
ind_del=cat(1,stc_regprops.Area)% Search for areas to small to be a drop
stc_regprops(ind_del)=[]; % Delete all objects smaller than Area threshold
arr_area=[stc_regprops.Area]';
arr_perim=[stc_regprops.Perimeter]';
arr_circ=4.*arr_area.*pi./arr_perim.^2; %(get circular area)
arr_diameter=cat(1,stc_regprops.BoundingBox(3,:)); % arr diam corner to corner
arr_surfaceSpread=(arr_perim./arr_diameter).^2; % Fowler 1994
arr_ncloudy=[length(stc_regprops.PixelList)]'; % Save number of pixels for each object
% Save Data
stc_VID.ImageData(framenr).Area=arr_area*var_pixsize^2; %m2
stc_VID.ImageData(framenr).Centroid=cat(1,stc_regprops.Centroid)*var_pixsize; %m
stc_VID.ImageData(framenr).Extrema=cat(1,stc_regprops.Extrema)*var_pixsize;%m
stc_VID.ImageData(framenr).DropDiameter=arr_diameter*var_pixsize;%m
stc_VID.ImageData(framenr).DropVolume=stc_VID.ImageData(framenr).Area.*stc_VID.ImageData(framenr).DropDiameter';%m3
stc_VID.ImageData(framenr).SurfaceSpread=arr_surfaceSpread; %
stc_VID.ImageData(framenr).SurfaceTouchPts=arr_ncloudy;
很高兴能给您帮忙! 这里可以先采用仿射变换(Affine Transformation)技术来处理变形的图片,关于仿射变换技术的基本原理和实现可以先参考Matlab文档中“矩阵变换”(Matrix Transforms)进行学习。具体的实现可以使用Matlab中提供的函数“affine2d”来实现,也就是:
tform=affine2d(A); % 其中A是一个仿射变换矩阵,用来表示变形程度差距。
然后,通过使用函数“imwarp”来把你的变形之后的图片转换成原来的样式,命令如下:
img2=imwarp(img1,tform); % 其中img1是变形之后的图片,img2是恢复变形之后的图片。
最后,使用Matlab中自带的函数imrect来定义你的水的区域,命令如下:
rect=imrect(gca, [x y width height]); % 其中x,y,width,height是你定义的水的区域的参数。
最后,使用函数rect.Area计算出变形恢复之后水的区域的面积。
希望能够帮到您!
不知道你这个问题是否已经解决, 如果还没有解决的话: