You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何通过循环为多幅图像保存单个特征.mat文件(修复仅存最后图像数据问题)

解决.mat文件仅保留最后一幅图像特征的问题

我一眼就看出问题出在哪了——你每次处理新图像的外层循环里,没有把当前图像的特征累积到全局变量里,反而每次都直接覆盖了Feat变量,最后自然只剩最后一张图的数据。下面是具体的修复方案和修改后的代码:

问题根源

在外层for n = n1:n2循环中,你每次处理新图像时,内层循环生成的Feat都会直接覆盖上一次循环的结果,没有做任何累积操作。当所有图像处理完后,Feat里就只有最后一幅图像的目标特征了。

修复步骤

  1. 初始化全局特征存储矩阵:在外层循环开始前,创建一个空矩阵allFeats,用来存放所有图像的所有目标的特征。
  2. 每次处理完单张图像后追加特征:在内层循环结束后,把当前图像的Feat追加到allFeats中。
  3. 保存全局特征矩阵:最后保存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

火山引擎 最新活动