Matlab批量提取图片特征向量

news/2024/6/17 15:40:54 标签: matlab, 算法, 人工智能

最近matlab数字图像处理课程需要,对上千张训练集测试集图片进行批量的特征提取,作为 SVM的输入。

所以就有了用matlab来批量提取图像特征向量,并保存,方便后续使用。

批量提取函数:

matlab"> % 函数返回参数
    % 分类列向量Categorys, 和 特征向量矩阵Features, 也会自动将两个变量保存在  saveMatName 文件内   
 
% 使用示例
        % 提取 train训练集特征和分类
        %     [Categorys,Features]=extractAndSaveFeatures('train.mat', sourceFolderPath, saveMatPath)
        %     load('train.mat',  '-mat');
        %     p_Trains_Categorys =Categorys ;  %取分类  1列向量 
        %     p_Trains_Features  =Features  ;  %取特征  一行对应一张图全部特征,一列对应一类特征
        % 提取 test测试集特征和分类
        %     [Categorys,Features]=extractAndSaveFeatures('test.mat', sourceFolderPath, saveMatPath)
        %     load('test.mat',  '-mat');
        %     p_Test_Categorys =Categorys ;  %取分类  1列向量 
        %     p_Test_Features  =Features  ;  %取特征  一行对应一张图全部特征,一列对应一类特征
   

function [ Categorys, Features ]=extractAndSaveFeatures(saveMatName, sourceFolderPath, saveMatPath)
    
    addRootSonDir( ); % 确保依赖函数 已经添加到目录
    if nargin < 3   saveMatPath = '';  end %应该是存放在工作区目录下
    
    % 函数输入参数
    % saveMatName       % 保存的最后结果文件名        mat类型文件名如 train.mat
    % sourceFolderPath  % 原始文件路径                绝对路径 如 J:/test
    % savePath          % 保存mat文件变量路径         绝对路径 

    % 函数返回参数
    % 分类列向量Categorys, 和 特征向量矩阵Features, 也会自动将两个变量保存在  saveMatName 文件内
        
%% 参数设置
    sizeA = 96; 
    sizeB = 96; % 每一张图都为这么大统一处理  长宽调整为a*b  
    
    
    %% 处理开始,获取全部文件列表
    fileList = dir(fullfile(sourceFolderPath, '*.png'));% 获取文件夹中所有文件的列表 
    
    %% 先单张读取,确定特征长度; 先单张读取,确定特征长度; 先单张读取,确定特征长度;              
    fileName = fileList(1).name;
    [~, name, ~] = fileparts(fileName);
    path = fullfile(sourceFolderPath, fileName);
    img = imread(path); img = imresize(img, [sizeA, sizeB]);
    
    
    HogFeatures = extractHOGFeatures(img);  %执行HOG特征提取 确保批量提取和这里一致,
    RGBFeatures = GetColorHist(img);        %执行RBG特征提取
     
    HogLength = size(HogFeatures,    2); %下面用到 这张图片特征向量长度 作为每个张的长度
    RGBLength = size(RGBFeatures,    2);
    fprintf('提取%s开始\n',saveMatName);
    fprintf(' 1.保存文件:%s\n',fullfile(saveMatPath, saveMatName));
    fprintf(' 2.提取文件的源目录:%s\n',sourceFolderPath);
    fprintf(' 3.批量处理图片的大小:长*宽= %d × %d\n', sizeA, sizeB);
    fprintf(' 4.每张图特征向量的长度: Hog:%d  RGB:%d\n', HogLength, RGBLength);
    %%   批量提取 批量提取 批量提取 批量提取 批量提取  批量提取 批量提取
    % 初始化存储数据的向量矩阵
    fileNums = length(fileList);
    Categorys = zeros(fileNums, 1);
    Features  = zeros(fileNums,  HogLength+RGBLength);


dispStr = sprintf('进度:%6d/%6d', 0, 0);
clearStr= [repmat('\b', 1, numel(dispStr)), '%s'];
fprintf(dispStr);

    for i = 1:fileNums
        if mod(i, 150) == 0
            fprintf(clearStr);fprintf('进度:%6d/%6d', i, fileNums);
        end

        fileName = fileList(i).name;
        [~, name, ~] = fileparts(fileName);
        NameFirts_Part = strsplit(name, '_');%切割出文件名第一段数字作为分类编号
        Categorys(i, 1) = str2double(NameFirts_Part{1});% 收集分类 本张图片
        
        img = imread(fullfile(sourceFolderPath, fileName));
        img = imresize(img, [sizeA, sizeB]); % 读取图片并调整大小为512x512

        HogFeatures   = extractHOGFeatures(img);  % 执行HOG特征提取
        RGBFeatures   = GetColorHist(img);        % 执行RBG特征提取 

        for j = 1:HogLength % 收集HOG特征向量
            Features(i,  j) = HogFeatures(:, j);%添加
        end
        for j = 1:RGBLength % 收集RGB特征向量
            Features(i, HogLength+j) = RGBFeatures(:, j);%添加
        end
    end % for循环处理每张图 end
    fprintf(clearStr);fprintf('进度:%6d/%6d, 完成99%%。\n', i, fileNums);
    save(fullfile(saveMatPath, saveMatName), 'Features', 'Categorys');% 保存数据为 文件,  在其他.m文件中直接 加载这个可调用变量
    fprintf('本轮提取完成,%s保存成功\n------\n',saveMatName);
end


% 如果导入的多个文件中存在同名的变量,会导致冲突。
% 当使用load函数加载多个文件时,如果文件中存在同名的变量,
% 后面加载的文件会覆盖前面加载的文件中的同名变量。
% 
% 为了避免变量名冲突,可以在加载文件时使用不同的变量名来存储不同的变量。
% 例如,假设有两个文件data1.mat和data2.mat,它们都包含一个名为x的变量。
% 可以使用以下代码来加载这两个文件,并将它们分别存储在变量x1和x2中:
% 
% load('data1.mat',  '-mat');
% x1 = x;
% 
% load('data2.mat',  '-mat');
% x2 = x;
% 
% 这样,变量x1和x2分别存储了data1.mat和data2.mat中的x变量,避免了变量名冲突。



function color_hist = GetColorHist(img)
    gray_img = rgb2gray(img);
    color_hist = imhist(gray_img) / numel(gray_img);
    color_hist = color_hist';
end



function addRootSonDir(rootDir) % 将输入的根目录+子目录 全都自动添加入环境变量
    if nargin < 1 || isempty(rootDir) % 如果参数为空,将调用本函数的文件所处目录作为rootDir,添加环境变量
        stack = dbstack('-completenames');
        callingScript = stack(2).file ;  % 1-脚本函数自身目录,2-调用所处目录
        [scriptDir, ~, ~] = fileparts(callingScript);
        rootDir = scriptDir;
    end
    
    subDirs = dir(rootDir);
%     disp(rootDir);
    subDirs = subDirs([subDirs.isdir]);
    subDirPath = fullfile(rootDir, subDirs(1).name);
    addpath(subDirPath);
    for i = 3:length(subDirs) % 从3开始,  因为 1 \. ; 2 \..;  3 子目录第一个;
        subDirPath = fullfile(rootDir, subDirs(i).name);
        addpath(subDirPath);
    end

%     disp('---||所有已添加的用户库目录(不包含软件默认的系统库目录):');
%     paths = strsplit(path, ';');
%     for i = 1:length(paths)
%         if ~contains(paths{i}, '\Program Files\MATLAB\') && ~contains(paths{i}, '\AppData\Local\Temp\')
%             disp(paths{i});
%         end
%     end
%     disp('---||用户库目录管理操作完成。');
end

主要提取了

  • HOG特征
  • 色彩特征?
  • 有需要的可以直接参考修改,修改提取特征向量的函数就可了。
  • 还有就是保存文件类型,这里直接存为.mat了, 也可以自行修改,保存为.csv , excel表格之类的格式。
    不忍直视写的依托函数。

下面是如何提取特征示例:

matlab">clc,clear;
%添加库文件目录
% ............ extractAndSaveFeatures.m 用到的特征提取函数
%         HogFeatures   = extractHOGFeatures(img);  % 执行HOG特征提取
%         RGBFeatures   = GetColorHist(img);        % 执行RBG特征提取
%%  请分节运行 避免卡死机 ; 选中节段 ,快捷键 ctrl+enter运行节

%%
saveNameT = 'Train.mat'; % 训练集
FolderPathT = '源图片文件路径'; 
savePathT = '保存路径';
[P_trainTypes,P_trainFeatures]=extractAndSaveFeatures(saveNameT,FolderPathT,savePathT);

%%
saveNameE = 'Test.mat'; %  测试集
FolderPathE = '源图片文件路径'; 
savePathE = '保存路径';
[P_testTypes,P__testFeatures]=extractAndSaveFeatures(saveNameE,FolderPathE,savePathE);
 
 
%% 如何在matlab中调用保存好的.mat 内的变量 
        % 提取 train训练集特征和分类
        %     [Categorys,Features]=extractAndSaveFeatures('train.mat', sourceFolderPath, saveMatPath)
        %     load('train.mat',  '-mat');
        %     p_Trains_Categorys =Categorys ;  %取分类  1列向量 
        %     p_Trains_Features  =Features  ;  %取特征  一行对应一张图全部特征,一列对应一类特征
        % 提取 test测试集特征和分类
        %     [Categorys,Features]=extractAndSaveFeatures('test.mat', sourceFolderPath, saveMatPath)
        %     load('test.mat',  '-mat');
        %     p_Test_Categorys =Categorys ;  %取分类  1列向量 
        %     p_Test_Features  =Features  ;  %取特征  一行对应一张图全部特征,一列对应一类特征

http://www.niftyadmin.cn/n/5168790.html

相关文章

基于SSM的博客系统

基于SSM的博客系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringMyBatisSpringMVC工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 热点 博客详情 登录界面 管理员界面 博主界面 摘要 博客系统作为信息传播和分享的重…

前端设计模式之【观察者模式】

文章目录 前言介绍实现优缺点应用场景后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端设计模式 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&#…

深度系统v15.4正式发布,惊艳眼球

导读深度操作系统是一个致力于为全球用户提供美观易用、安全可靠的Linux发行版。深度桌面操作系统V15.4专业版使用全新设计的控制中心和重构桌面&#xff0c;采用模糊透明整体风格&#xff0c;全新的热区交互及窗口管理器动效&#xff0c;精挑细选的桌面壁纸&#xff1b;采用全…

Python 对象表现得像函数

Python 对象表现得像函数 flyfish 面向对象编程里有句话一切皆对象。everything is an object&#xff0c;python里就是这样 module 是 object import math my_math math my_math.a1 #为module object新增一个名为a的属性 print(my_math.a)class 是 object class Person:…

蓝桥杯每日一题2023.11.10

“蓝桥杯”练习系统 (lanqiao.cn) 题目描述 题目分析 对于此题&#xff1a;我们看到题目要求尽可能大&#xff0c;会联想到二分&#xff0c;注意切出的一定为正方形&#xff0c;其能切出的个数为(h[i] / x) * (w[i] / x)&#xff0c;将所有的个数与要求的个数进行对比&#x…

人工智能中的基础之一——Python

Python作为一种简洁、易学、功能丰富的高级编程语言&#xff0c;被广泛应用于数据分析、人工智能、Web开发等各个领域。本文将介绍Python的基础语法和使用&#xff0c;帮助读者快速上手Python编程。 一、Python基础语法 1. 变量和数据类型 在Python中&#xff0c;可以使用变…

SOME/IP 协议介绍(二)

1. SOME/IP header 出于互操作性的原因&#xff0c;所有SOME/IP的实现都应具有相同的标头布局如图1中显示。字段按传输顺序呈现&#xff0c;即左上方的字段首先进行传输。在接下来的章节中&#xff0c;将描述不同的标头字段及其用途。 1.1. IP地址/端口号 图1中的布局显示了在…

Android Audio实战——音量设置(十九)

接上一篇,上一篇文章介绍了静音状态的设置和获取,这里我们看一下音量设置的流程。 一、流程分析 SysSettingAdapter private static int mVolumeGroupIdMedia = VOLUME_GROUP_INDEX_MEDIA;private static final int VOLUME_GROUP_INDEX_MEDIA = 0;/*** 获取媒体音音量*/ p…