我是靠谱客的博主 寂寞蜡烛,最近开发中收集的这篇文章主要介绍Matlab实现图像处理并以xml格式存入文件,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目:给出一组图片(图片上框有不同颜色的方框,同一颜色的方框可能有多个,不同颜色的方框代表不同的类别)
例如这样的图片:
在这里插入图片描述
要求
①在一个文件夹里循环读入图片
②输出图片的宽、高、框的类别、框的左下角坐标(X,Y),框右上角坐标(X,Y),标注的难易程度(0:不难)
③将输出的结果保存成xml类型(根节点、子节点、二级节点)的文件中,保存的文件名与读入的图片名相匹配。

实现过程:
①实现循环读文件夹中的图片:

          % 图像文件夹路径
          file_path =  'F:标注图';
          %获取该文件夹中所有jpg格式的图像
          img_path_list = dir(strcat(file_path,'*.jpg'));
          %获取图像总数量
          img_num = length(img_path_list);
          %有满足条件的图像
          if img_num > 0 
              %逐一读取图像
              for j = 1:img_num   
                     % 图像名
                     image_name = img_path_list(j).name;
                     rgb =  imread(strcat(file_path,image_name));
                      进行图像相关处理
               end
           end

②实现图像处理并达到输出要求:

        r = rgb(:,:,1);               %提取彩色图像的红色分量。
        g = rgb(:,:,2);               %提取彩色图像的绿色分量。
        b = rgb(:,:,3);               %提取彩色图像的蓝色分量。
        [w,h,s]=size(rgb);            %提取图像的高(行)、宽(列),维数(没有用到)
  
        red=r>=175&g<36&b<36;       %提取符合图片中红色的像素范围
        blue=r<=60&g<135&b>70;         %提取符合图片中蓝色的像素范围
        green=(20>r)&(g>80)&(g<100)&(b>20)&(b<=35);       %提取符合图片中绿色的像素范围
        orange=(r>200)&(g<118)&(g>36)&b<50;               %提取符合图片中橙色的像素范围
        purple=(175>r)&(r>97)&g<35&(b>52)&(b<=67);        %提取符合图片中紫色的像素范围
        
        a{1}=red;
        a{2}=blue;
        a{3}=green;          %将颜色存入矩阵
        a{4}=orange;
        a{5}=purple;
               
        yz=300;   %作为bwareaopen函数的参数
        for i=1:5
            if i==1
                str='车厢';
            elseif i==2
                str='车门';
            elseif i==3                          %不同颜色所代表的类别
                str='异物';
            elseif i==4
                str='插销';
            elseif i==5
                str='文字';
            end
            
            %删除二值图像BW中面积小于P对象
            colorb = bwareaopen(a{i},yz); 
            %一般默认8邻域
            connect_size = 8;    
            %创建由指定形状shape对应的结构元素,半径为8的圆形
            se = strel('disk',connect_size);
            %膨胀灰度,二值,压缩二值图像colorb。参数SE为由strel函数返回的结构元素或者结构元素对象组。
            colorb = imdilate(colorb,se);
            %找联通区域的数量
            L = bwlabel(colorb);
            num = max(max(L));
            B=cell(num,8);
            %依次取每个框的每个角的坐标和长款
            for i = 1:num
                [x,y] = find(L == i);
                minx=min(y);
                maxx=max(y);
                miny=min(x);
                maxy=max(x);
                Width=maxx-minx;
                Hight=maxy-miny;
                x2= minx+Width;
                y1=miny+Hight;

③将说出数据存入XML文件中

       docNode = com.mathworks.xml.XMLUtils.createDocument('annotation');
        docRootNode = docNode.getDocumentElement;
        thisElement = docNode.createElement('size');
        docRootNode.appendChild(thisElement);
        
        dataNode = docNode.createElement('width');
        dataNode.appendChild(docNode.createTextNode(sprintf('%g',h)));
        thisElement.appendChild(dataNode);
        
        dataNode = docNode.createElement('height');
        dataNode.appendChild(docNode.createTextNode(sprintf('%g',w)));
        thisElement.appendChild(dataNode);

        thisElement = docNode.createElement('object');
        docRootNode.appendChild(thisElement);
                
        dataNode = docNode.createElement('name');
        dataNode.appendChild(docNode.createTextNode(sprintf('%s',str)));
        thisElement.appendChild(dataNode);
                
        dataNode = docNode.createElement('difficult');
        dataNode.appendChild(docNode.createTextNode(sprintf('%g',0)));
        thisElement.appendChild(dataNode);
                
        CElement = docNode.createElement('bndbox');
        thisElement.appendChild(CElement);
        dataNode = docNode.createElement('xmin');
        dataNode.appendChild(docNode.createTextNode(sprintf('%g',minx)));
        CElement.appendChild(dataNode);
                
        dataNode = docNode.createElement('ymin');
        dataNode.appendChild(docNode.createTextNode(sprintf('%g',y1)));
        CElement.appendChild(dataNode);
                
        dataNode = docNode.createElement('xmax');
        dataNode.appendChild(docNode.createTextNode(sprintf('%g',x2)));
        CElement.appendChild(dataNode);
                
        dataNode = docNode.createElement('ymax');
        dataNode.appendChild(docNode.createTextNode(sprintf('%g',miny)));
        CElement.appendChild(dataNode);
        docNode.appendChild(docNode.createComment('this is a comment'));
        xmlwrite(filename,docNode);
        type(filename);

整体代码:

file_path =  'C:UsersAdministratorDesktoppic';% 图像文件夹路径
img_path_list = dir(strcat(file_path,'*.jpg'));%获取该文件夹中所有jpg格式的图像
img_num = length(img_path_list);%获取图像总数量
if img_num > 0 %有满足条件的图像
    for j = 1:img_num %逐一读取图像
        image_name = img_path_list(j).name;% 图像名
        rgb =  imread(strcat(file_path,image_name));
        r = rgb(:,:,1);               %提取彩色图像的红色分量。
        g = rgb(:,:,2);              %提取彩色图像的绿色分量。
        b = rgb(:,:,3);
        [w,h,s]=size(rgb);
        i = find('.'==image_name);
        a = image_name(1:i-1);
        imname = strrep(a, ' ', '');
        filename=[imname,'.xml'];
        fid=fopen(filename,'a');
       
        red=r>=175&g<36&b<36;
        blue=r<=60&g<135&b>70;
        green=(20>r)&(g>80)&(g<100)&(b>20)&(b<=35);
        orange=(r>200)&(g<118)&(g>36)&b<50;
        purple=(175>r)&(r>97)&g<35&(b>52)&(b<=67);
        
        a=cell(5,1);
        a{1}=red;
        a{2}=blue;
        a{3}=green;
        a{4}=orange;
        a{5}=purple;
        
        yz=300;   %作为bwareaopen函数的参数
        
        docNode = com.mathworks.xml.XMLUtils.createDocument('annotation');
        docRootNode = docNode.getDocumentElement;
        thisElement = docNode.createElement('size');
        docRootNode.appendChild(thisElement);
        
        dataNode = docNode.createElement('width');
        dataNode.appendChild(docNode.createTextNode(sprintf('%g',h)));
        thisElement.appendChild(dataNode);
        
        dataNode = docNode.createElement('height');
        dataNode.appendChild(docNode.createTextNode(sprintf('%g',w)));
        thisElement.appendChild(dataNode);
           
        for i=1:5
            if i==1
                str='车厢';
            elseif i==2
                str='车门';
            elseif i==3
                str='异物';
            elseif i==4
                str='插销';
            elseif i==5
                str='文字';
            end
            
            colorb = bwareaopen(a{i},yz);  %删除二值图像BW中面积小于P对象
            connect_size = 8;
            se = strel('disk',connect_size);
            colorb = imdilate(colorb,se);
            L = bwlabel(colorb);
            num = max(max(L));
            B=cell(num,8);
            
            
            for i = 1:num
                [x,y] = find(L == i);
                minx=min(y);
                maxx=max(y);
                miny=min(x);
                maxy=max(x);
                Width=maxx-minx;
                Hight=maxy-miny;
                x2= minx+Width;
                y1=miny+Hight;
               
                [m,n]=size(B);
                thisElement = docNode.createElement('object');
                docRootNode.appendChild(thisElement);
                
                dataNode = docNode.createElement('name');
                dataNode.appendChild(docNode.createTextNode(sprintf('%s',str)));
                thisElement.appendChild(dataNode);
                
                dataNode = docNode.createElement('difficult');
                dataNode.appendChild(docNode.createTextNode(sprintf('%g',0)));
                thisElement.appendChild(dataNode);
                
                CElement = docNode.createElement('bndbox');
                thisElement.appendChild(CElement);
                dataNode = docNode.createElement('xmin');
                dataNode.appendChild(docNode.createTextNode(sprintf('%g',minx)));
                CElement.appendChild(dataNode);
                
                dataNode = docNode.createElement('ymin');
                dataNode.appendChild(docNode.createTextNode(sprintf('%g',y1)));
                CElement.appendChild(dataNode);
                
                dataNode = docNode.createElement('xmax');
                dataNode.appendChild(docNode.createTextNode(sprintf('%g',x2)));
                CElement.appendChild(dataNode);
                
                dataNode = docNode.createElement('ymax');
                dataNode.appendChild(docNode.createTextNode(sprintf('%g',miny)));
                CElement.appendChild(dataNode);
            end
             docNode.appendChild(docNode.createComment('this is a comment'));
                xmlwrite(filename,docNode);
                type(filename);
                
        end
        fprintf('%d %d %sn',i,j,strcat(file_path,image_name));% 显示正在处理的图像名
        %图像处理过程 省略
        sta=fclose(fid);
    end
    
end

结果文件内容截图:
在这里插入图片描述

最后

以上就是寂寞蜡烛为你收集整理的Matlab实现图像处理并以xml格式存入文件的全部内容,希望文章能够帮你解决Matlab实现图像处理并以xml格式存入文件所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部