如何通过循环为多幅图像保存单个特征.mat文件(修复仅存最后图像数据问题)
解决.mat文件仅保留最后一幅图像特征的问题
我一眼就看出问题出在哪了——你每次处理新图像的外层循环里,没有把当前图像的特征累积到全局变量里,反而每次都直接覆盖了Feat变量,最后自然只剩最后一张图的数据。下面是具体的修复方案和修改后的代码:
问题根源
在外层for n = n1:n2循环中,你每次处理新图像时,内层循环生成的Feat都会直接覆盖上一次循环的结果,没有做任何累积操作。当所有图像处理完后,Feat里就只有最后一幅图像的目标特征了。
修复步骤
- 初始化全局特征存储矩阵:在外层循环开始前,创建一个空矩阵
allFeats,用来存放所有图像的所有目标的特征。 - 每次处理完单张图像后追加特征:在内层循环结束后,把当前图像的
Feat追加到allFeats中。 - 保存全局特征矩阵:最后保存
allFeats而不是原来的Feat。
另外,记得在内层循环前重新初始化Feat,避免和上一张图像的特征数据混在一起。
修改后的完整代码
NbIm = size(names1,1); n1 = 1; n2 = NbIm; % 初始化全局特征存储矩阵 allFeats = []; for n = n1:n2 %1- Read the original image %2- Processing : Segmentation %3- characterization : [B3,L3,N3] = bwboundaries(ICellules); CC = bwconncomp(L3); BW = bwlabel(L3); stats1 = regionprops(CC,'Area','Centroid','Eccentricity','Perimeter','ConvexArea','ConvexHull','ConvexImage','MajorAxisLength','MinorAxisLength','Orientation','Solidity','BoundingBox'); % 初始化当前图像的特征矩阵,避免和上一张图的特征混淆 Feat = []; for k = 1:length(B3), V = []; glcm = []; V = Im_originale(BW==k); glcm = graycomatrix(V,'Offset',[2 0],'Symmetric', true); stats= graycoprops(glcm); Contrast_Cellule = stats.Contrast; Correlation_Cellule = stats.Correlation; Energy_Cellule = stats.Energy; Homogeneity_Cellule = stats.Homogeneity; Area_cellule = stats1(k).Area; Perimeter_cellule = stats1(k).Perimeter; Circularity_cellule = (4*pi*Area_cellule)/Perimeter_cellule^2; Centroid_cellule = stats1(k).Centroid; Compactness_cellule = Perimeter_cellule^2/(4*pi*Area_cellule); MajorAxis_cellule = stats1(k).MajorAxisLength; MinorAxis_cellule = stats1(k).MinorAxisLength; Orientation_cellule = stats1(k).Orientation; Eccentricity_cellule = stats1(k).Eccentricity; Solidity_cellule = stats1(k).Solidity; boundary3 = B3{k}; [cc] = chaincode(boundary3); ai = cc.code; ai = ai.'; output = calc_harmonic_coefficients(ai,30); Ampl = 0.5*sqrt((output(1)^2)+(output(2)^2)+(output(3)^2)+(output(4)^2)); % 注意:Centroid_cellule是二维数组,直接拼接会增加两个特征维度,符合你15个特征的需求 Feat(k,:) = [Area_cellule,Perimeter_cellule,Circularity_cellule,Compactness_cellule, Solidity_cellule,Eccentricity_cellule,MajorAxis_cellule,MinorAxis_cellule, Centroid_cellule,Ampl,Contrast_Cellule,Correlation_Cellule,Energy_Cellule,Homogeneity_Cellule]; end % 将当前图像的所有目标特征追加到全局矩阵中 allFeats = [allFeats; Feat]; end % 保存全局特征矩阵 save('FeatTrain.mat', 'allFeats');
额外提示
如果你的特征维度固定(15个),可以预先指定allFeats的大小来提升性能,比如先统计所有图像的目标总数,然后初始化allFeats = zeros(totalObjects, 15);,再通过索引赋值,这样比每次追加更高效,适合数据量较大的情况。
内容的提问来源于stack exchange,提问作者Marwa Braiki




