Matlab按照彩色图像去除数据冗余

依据实验结果,确定为对于RGB三个分量,每个分量都做差,然后取二范数,如果其中有一个分量大于0.5,这个结果就保留。这应该是我目前编过的最复杂的Matlab程序了,主要是通过这个程序学习到了matlab结构体的好处,数组和cell在处理大量的数据的时候都太麻烦了。结构体加上数组、cell,才是matlab程序语言设计的保存数据的最好的格式。现在知道了为啥matlab读取视频,保存格式为结构体了。fighting!

  1 clear;close all;clc;
  2 %%
  3 %由于程序运行的时间太长了,保存第一个运行的输出
  4 % 程序开始执行
  5 % 读取图片文件信息,并按类、视频序号、文件尺寸,
  6 % 存到结构体fileInfoPartition中,耗时:291.5183
  7 %
  8 % 把结构体fileInfoPartition按阈值0.5为分割在结构体fileInfoResult
  9 % 共耗时:3601.5324
 10 %
 11 % 拷贝简化后的数据共花费时间:83.9876
 12 %
 13 % 拷贝冗余的数据共花费时间:91.4804
 14 %%
 15 %程序如何操作:
 16 %把变量pathSource改为要处理的图片数据,所在的文件夹,就数字时间码识别而言。就是各个子分类0、1、2上一级文件夹
 17 %把变量pathDestination改为处理好数据保存的文件夹
 18 %destinationFlag和redundanceFlag分别控制是否保存原始的数据和冗余数据
 19 %%
 20 %下一步改进:
 21 %
 22 %%
 23 %程序实现的功能
 24 %1、根据指定的路径、视频序号和差距系数,挑选出对应相同视频号的相同位置数字的冗余的数据
 25 %2、把先前挑选出的原始数据保存在文件夹pathdestination、冗余数据保存在文件夹pathredundance
 26 %%
 27 %程序中用到的新功能:之前一直没用过结构体,现在用了结构体数组。
 28 %程序中用到的之前不清楚的函数如下
 29 %1)unique(a):提取数组a中的唯一数据,输出结果按从大到小排序。但发现这只能处理1维数组效果比较好。
 30 %多维数组并不会选取不同的数组,而会提取出数组中不同的数字
 31 %2)setdiff(a,b):返回在a而不在b中的值,返回的值是按从小到大排列,如果a和b完全相同,则返回一个空矩阵
 32 %3)exit(‘folder‘,dir):判断文件夹是否存在,存在返回7,不存在返回0.还可以判断文件是否存在之类的。
 33 %4)norm(a):矩阵的2范数,求所有项的平方和在开根号
 34 %5)
 35 %%
 36 %变量命名规则:
 37 %总路径下一层的文件夹记为dir(directory)
 38 %最后一层就是各个文件记为file
 39 %%
 40 %程序编程思路:
 41 %比较冗余数据肯定是挑选出相同视频、相同位置、相同数字的图片(不同位置,也可能存在尺寸一样的情况)
 42 %而满足相同视频、相同位置的图片,尺寸肯定是相同的。根据这点可以减少数据的运算量
 43 %考虑到真实的数据,好像只能用做差的方差来找相同尺寸的图片直接的差异性
 44 tic;
 45 disp(‘程序开始执行‘);
 46 %%%%%%%%%%%%需要更改的参数%%%%%%%%%%%%%%%%%%%%
 47 %要处理的数据的源地址,里面有子文件夹0、1、2...9
 48
 49 pathSource=‘C:\Users\Dy\Desktop\彩色视频真实数据\sjz‘;
 50
 51 %保存去冗余后数据的路径
 52
 53 pathDestination=‘C:\Users\Dy\Desktop\彩色视频真实数据\sjdr‘;
 54
 55 %是否生成无冗余数据的标志符号,为0,不生成,非0生成
 56
 57 simplifyFlag=1;
 58
 59 %是否生成冗余数据的标志符号,为0,不生成,非0生成
 60
 61 redundanceFlag=1;
 62
 63 %判断数据,是否冗余的阈值,初步选为0.5
 64
 65 differentCriterion=0.5;
 66
 67 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 68 %先读取pathSource文件夹下存在的子文件,保存子文件夹信息。方便后面处理。
 69 dirList=dir(pathSource);%读取文件夹列表,这种方式读取会保留原文件.(在结构体中第一个)和上一层目录..(在结构体第二个)
 70 countDir=length(dirList);%文件夹个数
 71
 72 %%
 73 %提取出原始数据里面的有用数据保存到结构体中
 74 %把文件的全部信息一次性全部先读取到一个结构体数组fileInfoRaw中来
 75 % 结构体数字,第一维为类别(相对应子文件夹文件名加1),第二维为图片序号
 76 % 结构体数组中有字段
 77 % name:图片的名字
 78 % videonum:图片来源于那个视频
 79 % size:[图片的宽(竖直方向跨度),图片的长度(水平方向跨度),3]
 80 % dirList=dir(pathSource);%读取文件夹列表,这种方式读取会保留原文件.(在结构体中第一个)和上一层目录..(在结构体第二个)
 81 % countDir=length(dirList);%文件夹个数
 82 for numDir=3:countDir%先读取数据文件夹pathSource下的子文件夹
 83     if(length(dirList(numDir).name)>=2)%根据这个过滤掉在此文件夹可能存在的各种txt文件
 84         continue;
 85     end
 86     fileList=dir([pathSource,‘\‘,dirList(numDir).name]);
 87     countFile=length(fileList);
 88     for numFile=3:countFile%依次读取所有的文件名
 89         %去除图片所属的视频序号
 90         tempName=fileList(numFile).name;
 91         nameStart=strfind(tempName,‘_‘);
 92         nameEnd=strfind(tempName,‘-‘);
 93         tempVideoOrder=tempName(nameStart+1:nameEnd-1);
 94         tempPic=imread([pathSource,‘\‘,dirList(numDir).name,‘\‘,fileList(numFile).name]);
 95         %tempSize=size(tempPic);%读取的当前图片的size
 96         %要注意提取出来的子文件的名称再加1得到了结构体的数据信息,而numFile是从第3开始的,所以要减2
 97         fileInfoRaw(str2double(dirList(numDir).name)+1,numFile-2).name=tempName;
 98         fileInfoRaw(str2double(dirList(numDir).name)+1,numFile-2).videonum=str2double(tempVideoOrder);
 99         fileInfoRaw(str2double(dirList(numDir).name)+1,numFile-2).size=size(tempPic);
100     end
101 end
102
103 %读取出所有的视频序号
104 %读取第一个子文件中的视频数据(一般而言每个视频肯定都会生成数据0,所以读取0文件夹可以选出所有的视频序号的)
105 [sumClasses,maxFile]=size(fileInfoRaw);
106 videoList(1)={0};%cell中第一项填充一个0方面后续的程序编写。
107 %原本想去除所有的视频序号,然后用unique提取出唯一信息。
108 %但由于视频序号并不是统一规格的长短,所以只能用比较麻烦的方法。
109 % for numFile=1:maxFile
110 %     if ~isempty(fileInfoRaw(numFile).videonum)
111 %         videoList=[videoList;fileInfoRaw(numFile).videonum];
112 %     end
113 % end
114 %读取第一个结构体,就是子文件夹0中的图片数量,挑选没有重复的数据
115 for numFile=1:maxFile
116     %注意这里的fileInfoRaw(1,numFile),就是指定了子文件夹0中的数据,不能忘记这个1
117     if ~isempty(fileInfoRaw(1,numFile).videonum)
118         countVideo=length(videoList);
119         for tempVideoNum=1:countVideo
120             if videoList{tempVideoNum} == fileInfoRaw(1,numFile).videonum
121                 continue;
122             else
123                 %一开始没加这行,伤不起呀。必须是比较完videoList中所有的
124                 %视频序号都没有相同的视频,才开始往videoList中添加
125                 if tempVideoNum == countVideo
126                     %下面这种方式,对于cell的操作,每次videoList多生成一行
127                     videoList=[videoList;fileInfoRaw(1,numFile).videonum];
128                 end
129             end
130         end
131     end
132 end
133 videoList=videoList(2:end);%删除第一项,得到了要处理的视频序号
134 sumVideo=length(videoList);%统计得到video的总数量
135
136 %由于要记录的信息太多,而又想不到能一步得到很多信息的方法。
137 %所以就把这些东西简单分为一小部分一小部分记录
138 %用二维结构体数组fileInfoSize保存图片的尺寸信息,第一维为类别,第二维为对应于videoList中相同位置的视频
139 %先用tempSize保存某一类,某一视频序号videoList{numVideo}下的所有的尺寸信息,
140 %然后再把这些信息保存到结构体fileInfoSize中
141 %结构体数组中有字段
142 %size:保存着对应于行(类别),列(视频videoList{numVideo})的所有尺寸
143 for numClass=1:sumClasses%对应的类别
144     for numVideo=1:sumVideo%对应的视频序号
145
146         if numVideo==4
147             temp=1;
148         end
149
150         tempSize={[0,0,0]};%必须是cell,才能方便每次统计在某个类别下面对应视频的size总数
151         %下面这个for,就是判断指定类别,指定视频序号的所有尺寸的累加
152         for i=1:maxFile
153             %因为结构体也是按最大尺寸,填充的,所以有一些是空的
154             %先判断,如果是空数据就不进行处理
155
156             if i==59
157                temp=1;
158             end
159
160             if isempty(fileInfoRaw(numClass,i).videonum)
161                 break;
162             %一次也就判断指定视频的尺寸,所以下面加入判断是对应的视频才处理
163             elseif videoList{numVideo}==fileInfoRaw(numClass,i).videonum
164
165                 countTempSize=length(tempSize);
166                 %选取到某一个文件信息,然后用tempSize中的所有尺寸信息和其比较,如果都不相同,在添加到tempSize中
167                 for numTempSize=1:countTempSize
168                     %先用setdiff判断数组tempSize{numTempSize}和fileInfoRaw(numClass,i).size
169                     %是否相同,如果相同则返回空,正好用isempty判断
170                     %下面一开始判断两个数组是否相等是只有语句isempty(setdiff(tempSize{numTempSize},fileInfoRaw(numClass,i).size))
171                     %而这个函数为setdiff(a,b)只是返回b中没有的a的值,那么遇到a=[17 17 3]
172                     %b=[17 15 3],则setdiff(a,b)返回空,所以用了下面这种加强的判断方法,
173                     %[setdiff(a,b),setdiff(b,a)]注意两个数组直接连接用的是逗号
174                     %这样就可以两个数组直接是不是相等,完全判断
175                     if isempty([setdiff(tempSize{numTempSize},fileInfoRaw(numClass,i).size),setdiff(fileInfoRaw(numClass,i).size,tempSize{numTempSize})])
176                         %一开始这写为continue,这是错误的。因为上面的for是在整个tempSize里面
177                         %找是否有相同的,有相同的就停止执行后面的else中的添加功能。
178                         %如果改为continue了,反倒成了找tempSize中是否有和当前size中不同的数据
179                         %如果有,就加进tempSize中。这相当蛋疼。哎,太菜了。
180                         %不过也是之前没写过那么复杂的程序。。。。
181                         break;
182                     else
183                         %又忘了加后面这个判断了,如果是所有的在tempSize中的尺寸都比较完之后
184                         %还是没有发现和fileInfoRaw(numClass,i).size相同的数据,才往
185                         %tempSize中添加新数据
186                         if numTempSize == countTempSize
187                             tempSize=[tempSize;fileInfoRaw(numClass,i).size];
188                         end
189                     end
190                 end
191             end
192         end
193         %上面这个for,就取出了对应类别,对应视频的所有不同的尺寸,由于有个初始的[0,0,0]
194         %所以去掉第一个初始值,从第二个开始
195         tempSize=tempSize(2:end);
196         fileInfoPartition(numClass,numVideo).picSize=tempSize;
197     end
198 end
199
200 %把每个类、每个视频中的所有的尺寸信息保存到了结构体fileInfoSize中,
201 %在结构体fileInfoSize再加入sumSize这个字段来统计,对应结构体下各种多少种size的图像
202 for numClass=1:sumClasses%对应的类别
203     for numVideo=1:sumVideo%对应的视频序号
204         fileInfoPartition(numClass,numVideo).sumSize=size(fileInfoPartition(numClass,numVideo).picSize,1);
205     end
206 end
207
208 %往结构体fileInfoPartition中添加字段nameList
209 %nameList中有sumSize行,分别对应于picSize中各行的尺寸
210 %由于早已经把要处理的信息都保存在结构体fileInforRaw,所以只要读取里面的信息就可以了
211 %[sumClasses,maxFile]=size(fileInfoRaw);
212 %sumVideo=length(videoList);%统计得到video的总数量
213 for numClass=1:sumClasses%对应的类别
214     for numVideo=1:sumVideo%对应的视频序号
215         for numSize=1:fileInfoPartition(numClass,numVideo).sumSize%遍历每个类别对应视频下的所有尺寸数据
216             tempName={‘0‘};%cell类型,方便统计最后的相同尺寸的文件的数量,可以存放不同类型的数据
217             for numFile=1:maxFile
218                 %由于结构体,会规整整个结构体的尺寸,所以要首先判断,当前结构体数字下的内容是否为空
219                 if isempty(fileInfoRaw(numClass,numFile).videonum)
220                     %按顺序遍历整个结构体中的数据,如果发现空内容,所以当前分类的数据已经、
221                     %遍历完,所以break,进入下一个类
222                     break;
223                 elseif videoList{numVideo}==fileInfoRaw(numClass,numFile).videonum
224                     %上面先进行判断是不是属于这个视频的数据
225                     %下面判断,是不是属于这个尺寸的数据
226                     if isempty([setdiff(fileInfoPartition(numClass,numVideo).picSize{numSize},fileInfoRaw(numClass,numFile).size), ...
227                             setdiff(fileInfoRaw(numClass,numFile).size,fileInfoPartition(numClass,numVideo).picSize{numSize})])
228                         tempName=[tempName;fileInfoRaw(numClass,numFile).name];
229                     end
230                 end
231             end
232             %上面这个for为在某个类别,对应视频序号,按顺序的某个尺寸遍历完的所有文件名列表
233             tempName=tempName(2:end);
234             %由于打算把计算出来的文件名列表保存按行(对应于结构体中picSize中的尺寸信息)
235             %而这样文件名列表不同行(即不同尺寸)的文件数量是不相等的
236             %对于这种不同维度的数据,直接一行一行操作cell会出错,所以只能一个一个进行添加
237             sumName=length(tempName);
238             for i=1:sumName
239                 fileInfoPartition(numClass,numVideo).nameList(numSize,i)=tempName(i);
240             end
241             %想到了反正都算出了了不同类别不同视频不同尺寸的文件数量
242             %那就把这个信息保存到结构体的字段picSizeCount中,每行都对应picSize中文件数量
243             fileInfoPartition(numClass,numVideo).picSizeCount(numSize,1)=sumName;
244         end
245     end
246 end
247 %读取文件信息,并按类、视频序号、文件名尺寸存到结构体fileInfoPartition中
248 disp(‘读取图片文件信息,并按类、视频序号、文件尺寸,‘);
249 disp([‘存到结构体fileInfoPartition中,耗时:‘,num2str(toc)]);
250
251 %%
252 %终于把有用的信息都提取到了结构体fileInfoPartition中,结构体总共有10行(10个类别),n列(n个视频)
253 %结构体有字段:
254 %picSize:对应类(结构体行)和视频(结构体列)的数据的尺寸
255 %sumSize:对应类(结构体行)和视频(结构体列)的数据的各种尺寸的总数
256 %nameList:对应类(结构体行)和视频(结构体列)和对应数据的尺寸(对应于字段picSize的行)的文件名列表
257 %picSizeCount:对应类(结构体行)和视频(结构体列)和对应数据的尺寸(对应于字段picSize的行)的文件总数
258
259 %计划把判断是否冗余,计算好后的数据保存到结构体fileInfoResult中
260 %picSize:对应类(结构体行)和视频(结构体列)的数据的尺寸
261 %sumSize:对应类(结构体行)和视频(结构体列)的数据的各种尺寸的总数
262 %nameList:对应类(结构体行)和视频(结构体列)和对应数据的尺寸(对应于字段picSize的行)的文件名列表
263 %和fileInfoPartition中数据相比是它的两倍的行数,相当于把fileInfoPartition中的每一行拆为两行,奇数行为冗余
264 %偶数行为对应的未冗余
265 %picSizePartitionCount:对应于namelist中各行的数据量
266
267 tic;
268 %先把数据在新建的结构体中完成分割,然后再根据destinationFlag和redundanceFlag确定是否要写入分割的数据
269 %先整体扫描结构体中fileInfoPartition,计算出所有的是否冗余的信息,然后存到fileInfoResult中
270 % pathSource=‘C:\Users\Dy\Desktop\彩色视频真实数据\val2‘;
271 %[sumClasses,maxFile]=size(fileInfoRaw);
272 %sumVideo=length(videoList);%统计得到video的总数量
273 %vainFlag:发现要添加一个vainFlag的标记来,取消掉某一个文件名的重复比较
274 %主要是考虑到每到一个文件名,都要计算后面所有的文件是否重复,这个计算量有点大。
275 %而且如果不添加这个flag,会导致比如重复图片中的最后一个图片会被添加到无冗余数据的列表中
276 for numClass=1:sumClasses%对应的类别
277     for numVideo=1:sumVideo%对应的视频序号
278 %         if numVideo==3
279 %             temp=1;
280 %         end
281         for numSize=1:fileInfoPartition(numClass,numVideo).sumSize%遍历每个类别对应视频下的所有尺寸数据
282            %把字段picSize和sumSize也补上
283            fileInfoResult(numClass,numVideo).picSize=fileInfoPartition(numClass,numVideo).picSize;
284            fileInfoResult(numClass,numVideo).sumSize=fileInfoPartition(numClass,numVideo).sumSize;
285             %用中间变量nameRedundancyTempList来保存对应类别,视频,尺寸的独特的文件名和冗余文件名
286             nameRedundancyTempList={‘0‘};%保存对应类别,视频,尺寸的冗余的文件名
287            for numName=1:fileInfoPartition(numClass,numVideo).picSizeCount(numSize)%遍历每个类别对应视频下的对应尺寸的文件的多少
288                %初始化vainFlag,使其每次开始检测一个新的文件的时候,都是Ok的,后面发现如果是冗余数据,在置为0
289                vainFlag=1;
290                %加入判断条件如果遍历到的文件名,已经保存在nameRedundancyTempList中,那么就不需要进行后续的检查了。直接下一个文件
291                sumRedundancy=length(nameRedundancyTempList);
292                for i=1:sumRedundancy
293                    %如果在nameRedundancyTempList中发现了当前处理的文件
294                    if strcmp(fileInfoPartition(numClass,numVideo).nameList{numSize,numName},nameRedundancyTempList{i})
295                       vainFlag=0;
296                       break;%那么就置vainFlag为0,跳出这个循环,也就不用在进行下面的这个文件的所有操作了。
297                    end
298                end
299                %如果在冗余列表中发现已有了这个文件,那么这个文件属于vain,就不用进行下面的计算判断了
300                if vainFlag
301                    %从头到尾,遍历整个文件名列表,作为要比较的原始数据
302                    nameSource=[pathSource,‘\‘,num2str(numClass-1),‘\‘,fileInfoPartition(numClass,numVideo).nameList{numSize,numName}];
303                    picSource=im2double(imread(nameSource));
304                    %为numName可能的最后一个文件名,没有东西可以比较的情况,增加一个特定的判断
305                    %而且必须增加一个这样的判断,因为后面和原始图像相比较的,是它的后面一个图像
306                    %那么如果numName是文件名最后一个序列的时候,不加if先排除,for会出错
307                    if numName~=fileInfoPartition(numClass,numVideo).picSizeCount(numSize)
308                        for numNameCompare=(numName+1):fileInfoPartition(numClass,numVideo).picSizeCount(numSize)
309                            nameCompare=[pathSource,‘\‘,num2str(numClass-1),‘\‘,fileInfoPartition(numClass,numVideo).nameList{numSize,numNameCompare}];
310                            picCompare=im2double(imread(nameCompare));
311                            picResult=picSource-picCompare;
312                            %做出判断,如果差值里面有一个分量的范数大于0.5,那么就算是和原始图像有差距的图像
313                            if norm(picResult(:,:,1))>=differentCriterion || norm(picResult(:,:,2))>=differentCriterion || norm(picResult(:,:,3))>=differentCriterion
314                               %那么就算是和原始图像有差距的图像,先不进行处理
315
316                            else%如果范数不大于0.5,那么算是相似的图像,这个就可以保存在fileInfoResult的nameList中对应的偶数行中
317                               nameRedundancyTempList=[nameRedundancyTempList;fileInfoPartition(numClass,numVideo).nameList{numSize,numNameCompare}];
318                            end
319                        end
320                    end
321                end
322            end
323            %在这步,基本就是属于在某个类别、视频、尺寸下,所有的冗余的尺寸尺寸信息都保存在了nameRedundancyTempList,所以用下面的语句把内容,放到偶数nameList中去。
324            nameRedundancyTempList=nameRedundancyTempList(2:end);
325            sumRedundancy=length(nameRedundancyTempList);
326            if 0==sumRedundancy
327               %一开始没想到加这个if。主要是之前的方法忽略了一种极为特殊的情况,那就是如果在某类、某个视频,在某种尺寸下只有两个图片
328               %而且这两个图片是相异的(这种情况也有,也是后来发现程序运行bug,我才想到的)
329               %毕竟图片挑选的时候也是尽量挑选不一样的,视频太短的话,可能会出现这种情况
330               %这种特殊的情况下,nameRedundancyTempList里面没有数据,sumRedundancy=0
331               %则后面往奇数行的namelist中添加文件名的操作没办法实现。所以这个if后面,就是往结构体fileInfoResult
332               %的奇数行添加fileInfoPartition的整个文件名列表
333               for i=1:fileInfoPartition(numClass,numVideo).picSizeCount(numSize)
334                   fileInfoResult(numClass,numVideo).nameList(2*numSize-1,i)=fileInfoPartition(numClass,numVideo).nameList(numSize,i);
335               end
336               %对应的偶数行的nameList就是为空了
337               fileInfoResult(numClass,numVideo).nameList(2*numSize,1)={[]};%要注意这里赋空值的操作,一开始直接是[]赋值过去是不可以的
338               %补上这种特殊情况的picSizePartitionCount
339               fileInfoResult(numClass,numVideo).picSizePartitionCount(2*numSize-1,1)=fileInfoPartition(numClass,numVideo).picSizeCount(numSize,1);
340               fileInfoResult(numClass,numVideo).picSizePartitionCount(2*numSize,1)=0;
341            else
342                for i=1:sumRedundancy
343                    fileInfoResult(numClass,numVideo).nameList(2*numSize,i)=nameRedundancyTempList(i);
344                end
345                fileInfoResult(numClass,numVideo).picSizePartitionCount(2*numSize,1)=sumRedundancy;%反正都算了sumRedundancy,顺带把计数字段填上
346                fileInfoResult(numClass,numVideo).picSizePartitionCount(2*numSize-1,1)= ...
347                    fileInfoPartition(numClass,numVideo).picSizeCount(numSize)-sumRedundancy;%把计数字段不冗余的文件名补齐
348                %顺带把不冗余的文件名补齐
349                numName=1;%这里重新定义一个numName,和上面的(244行)遍历每个类别对应视频下的对应尺寸的文件的多少重复使用变量,但是互不干扰
350                for i=1:fileInfoPartition(numClass,numVideo).picSizeCount(numSize)
351                    for j=1:sumRedundancy
352                        if strcmp(fileInfoPartition(numClass,numVideo).nameList(numSize,i),fileInfoResult(numClass,numVideo).nameList(2*numSize,j))
353                            %即为找到了这个文件名是冗余文件,那就没必要进行后面的判断
354                            break;
355                        elseif j==sumRedundancy
356                               %如果在j等于sumRedundancy的时候,还没有找到同名文件,说明这个是独特的文件,那么添加到奇数的nameList中
357                               fileInfoResult(numClass,numVideo).nameList(2*numSize-1,numName)=fileInfoPartition(numClass,numVideo).nameList(numSize,i);
358                               numName=numName+1;
359                        end
360                    end
361                end
362            end
363         end
364     end
365 end
366 %把结构体fileInfoPartition按阈值为分割在结构体fileInfoResult,耗时
367 disp(‘ ‘);
368 disp([‘把结构体fileInfoPartition按阈值‘,num2str(differentCriterion),‘为分割在结构体fileInfoResult‘]);
369 disp([‘共耗时:‘,num2str(toc)]);
370
371 %终于把需要的信息都按照需求整到了结构体fileInfoResult中
372
373 %在路径pathDestination根据标识符simplifyFlag和redundanceFlag
374 %确定是否新建文件夹simplify和redundance,并在下面创建子文件夹0、1...9
375 %保存简化和冗余的数据
376 %要处理的数据的源地址,里面有子文件夹0、1、2...9
377 % pathSource=‘C:\Users\Dy\Desktop\sy1\val2‘;
378 %保存去冗余后数据的路径
379 %pathDestination=‘C:\Users\Dy\Desktop\彩色视频真实数据\sjdr‘;
380 %是否生成无冗余数据的标志符号,为0,不生成,非0生成
381 %simplifyFlag=1;
382 %是否生成冗余数据的标志符号,为0,不生成,非0生成
383 %redundanceFlag=1;
384 %由于创建了两个标志符,所以最简单的编程方法就是一个标志一个标志编程
385 %开始拷贝去冗余的数据
386 tic;
387 if simplifyFlag
388     pathSimplify=[pathDestination,‘\simplify‘];
389     mkdir(pathSimplify);
390     %[sumClasses,maxFile]=size(fileInfoRaw);
391     %sumVideo=length(videoList);%统计得到video的总数量
392     for numClass=1:sumClasses%对应的类别
393         mkdir([pathSimplify,‘\‘,num2str(numClass-1),‘\‘]);
394         for numVideo=1:sumVideo%对应的视频序号
395             for numSize=1:fileInfoResult(numClass,numVideo).sumSize%对应的尺寸
396                 for numName=1:fileInfoResult(numClass,numVideo).picSizePartitionCount(2*numSize-1)
397                     copyfile([pathSource,‘\‘,num2str(numClass-1),‘\‘,fileInfoResult(numClass,numVideo).nameList{2*numSize-1,numName}], ...
398                         [pathSimplify,‘\‘,num2str(numClass-1),‘\‘,fileInfoResult(numClass,numVideo).nameList{2*numSize-1,numName}]);
399                 end
400             end
401         end
402     end
403 end
404 disp(‘ ‘);
405 disp([‘拷贝简化后的数据共花费时间:‘,num2str(toc)]);
406
407 %开始拷贝去冗余的数据
408 tic;
409 if redundanceFlag
410     pathredundance=[pathDestination,‘\redundance‘];
411     mkdir(pathredundance);
412     %[sumClasses,maxFile]=size(fileInfoRaw);
413     %sumVideo=length(videoList);%统计得到video的总数量
414     for numClass=1:sumClasses%对应的类别
415         mkdir([pathredundance,‘\‘,num2str(numClass-1),‘\‘]);
416         for numVideo=1:sumVideo%对应的视频序号
417             for numSize=1:fileInfoResult(numClass,numVideo).sumSize%对应的尺寸
418                 for numName=1:fileInfoResult(numClass,numVideo).picSizePartitionCount(2*numSize)
419                     copyfile([pathSource,‘\‘,num2str(numClass-1),‘\‘,fileInfoResult(numClass,numVideo).nameList{2*numSize,numName}], ...
420                         [pathredundance,‘\‘,num2str(numClass-1),‘\‘,fileInfoResult(numClass,numVideo).nameList{2*numSize,numName}]);
421                 end
422             end
423         end
424     end
425 end
426 disp(‘ ‘);
427 disp([‘拷贝冗余的数据共花费时间:‘,num2str(toc)]);
时间: 2024-08-26 07:30:50

Matlab按照彩色图像去除数据冗余的相关文章

matlab作业 彩色图像读写实验

定义一个函数SubSamp,输入为彩色图像文件名,输出并显示尺寸减半的彩色 图像(原始.水平翻转.垂直翻转.中心区域变红).必须使用控制语句,在命令窗口成功调用! 因为彩色图像是3维的,黑白图像是2维的.如果我们在对图像尺寸减半时仍然使用 >> f=imread('e:\1.png'); >> f=f(1:2:end,1:2:end); >> imshow(f); 就会发现出来三个并排排列的灰色图像 所以要在后面再加1维即可 全部代码如下 function [img1,

高光谱遥感图像相关知识梳理大全

前言 ? 本资料整理了高光谱遥感图像概念定义.分析处理与分类识别的基本知识.第一部分介绍高光谱图像的一般性原理和知识,第二部分介绍了高光谱图像的噪声问题:第三部分介绍高光谱图像数据冗余问题以及数据降维解决冗余的方法:第四部分介绍高光谱图像的混合像元问题,对光谱解混做了一定介绍:第五部分和第六部分分别介绍了高光谱图像的监督分类和分监督分类的特点.流程和常用算法. 1.基本介绍 高光谱遥感(Hyperspectral remote sensing) 是将成像技术和光谱技术相结合的多维信息获取技术,同

matlab实现将彩色图像(R,G,B)色分量的直方图匹配,并计算其相关性

函数 实现将彩色图像转化为直方图分量向量 calcrgb2hist.m 文件 function hist  = calcrgb2hist(picname) pic1 = imread(picname); pic1R = pic1(:,:,1); pic1G = pic1(:,:,2); pic1B = pic1(:,:,3); figure,imshow(pic1R)                  title('R分量的图像') % 二,绘制直方图 [m,n]=size(pic1R);  

matlab在空域与频域中去除周期噪声、椒盐噪声的简单应用

前言 去年图像处理的DLL,有学弟问我做的思路,便放到博客里 github地址,欢迎star 图像增强处理:设计一套空间域与频率域结合的图像增强算法,处理以下任一组图片中的带噪声图像,去除噪声,提高图像质量. (1)已知:噪声为随机噪声和周期噪声混合噪声: (2)要求: a)去噪处理后,计算均方误差评估去噪处理后图像的去噪效果 b)撰写完整的科技报告(形式类似科技论文)表述自己的算法设计,算法实现与算法评估过程. 对 swanNoise 图像去噪 空域去噪 根据老师讲解,swanNoise.bm

初试 Matlab 之去除水印

这几天很痛苦地去学习了下用 Matlab 来处理图像,其实那些算法我觉得还不算很难理解,可是 Matlab 这种反人类的语法(可能对于我来说是这样吧,毕竟熟悉了 C++ / Java 的语法一时间很难转过来)折磨了我好久. 前些天在网上看到了一张图片: 想 po 上朋友圈,可又觉得右下角的水印被人看着好像不是很好,于是就想能否利用刚学会的一丁点儿的 Matlab 知识来把水印去掉呢?Show you my low code: 首先,读取图片: >> I = imread('D:\课程文件\图像

MATLAB去除人声

clear clc close all &&&&&&&&&&&&&&&&& 上面的几句话意思是清屏,清内存. &&&&&&&&&&&&&&&&& %[Original,fs,bits]=wavread('E:\Curriculum\The

matlab作图导出为PDF去除留白插入latex

latex写论文时,一般为了图片不失真,引用的图片需要转为pdf格式.matlab作图,直接导出为pdf经常遇到有灰色底色,有大片留白等不符合要求的情况,此博介绍一种简单的方法,轻松导出图片. 此外,先提供一种以前用过比较笨的方法:1.将灰色的底色调成和图内一样的白色:2.用截图工具截图,然后用adobe acrobat pro 软件(比adobe reader功能更强的软件)进行粘贴,截图修改边框. 舍友还介绍了一种她常用的方法,但是我导出为pdf以后上下留白没有解决.介绍一下,可以一试,文件

matlab进行图片的简单去除背景方法

1.选择要识别的图片 2.对图片进行二值化处理 3.对二值化图片进行腐蚀再膨胀(或者膨胀再腐蚀) %初始化 clc;clear all; %开始计时 tic %输入需要识别的图像 [filename,pathname,fi]=uigetfile(... {'*.*', 'all image file (*.*)';... '*.bmp','all image file (*.bmp)';... '*.jpg','all image file (*.jpg)'},... '请选择要识别的图片',.

matlab如何将数组中的NAN值去除

? ? 比如我们一组数据,里面有不少的NaN值,如何将其删除掉呢?可以通过find函数来搞定. ? ? 我们可以通过importdata('data.txt')将数据文件data.txt导入数组A中. ? ? ? ? ? ? ? ? ? ? ? ??? A=importdata('data.txt') ? ? 然后通过命令 ? ? ? ? ? ? ? ? ? ? ? ??z=find(~isnan(A)) ? ? 将A数组中NaN所在的编号给找出来: ? ? ? ? ? ? ? ? ? ? ?