批量处理
%%
% 读取文件夹下所有文件,把文件名作为数组
fileFolder = fullfile(matlabroot,'toolbox','images','imdata');
dirOutput = dir(fullfile(fileFolder,'AT3_1m4_*.tif'));
fileNames = {dirOutput.name}'
numFrames = numel(fileNames)
%%
% 将所有图像存入一个多为数组
I = imread(fileNames{1});
sequence = zeros([size(I) numFrames],class(I));
% class(I)获取图像数据类型,此处为uint8
sequence(:,:,1) = I;
for p = 2:numFrames
sequence(:,:,p) = imread(fileNames{p});
end
%%
% 图像局部标准差滤波
sequenceNew = stdfilt(sequence,ones(3));
%%
% 处理前后图像轮播
figure;
for k = 1:numFrames
imshow(sequence(:,:,k));
title(sprintf('Original Image # %d',k));
pause(1);
imshow(sequenceNew(:,:,k),[]);
title(sprintf('Processed Image # %d',k));
pause(1);
end
%% 读取视频
trafficVid = VideoReader('traffic.mj2')
get(trafficVid)
%% 播放视频
implay('traffic.mj2');
%% 去除深色车
darkCarValue = 50;
darkCar = rgb2gray(read(trafficVid,71));
noDarkCar
= imextendedmax(darkCar, darkCarValue);
% 最大扩展变换,作用效果类似二值化,第二个参数为阈值
imshow(darkCar)
figure, imshow(noDarkCar)
%% 图像开操作,去除小白点
sedisk = strel('disk',2);
noSmallStructures = imopen(noDarkCar, sedisk);
imshow(noSmallStructures)
%% 对每一帧进行同样的处理
nframes = trafficVid.NumberOfFrames;
I = read(trafficVid, 1);
taggedCars = zeros([size(I,1) size(I,2) 3 nframes], class(I));
for k = 1 : nframes
singleFrame = read(trafficVid, k);
% 一样的处理过程
I = rgb2gray(singleFrame);
noDarkCars = imextendedmax(I, darkCarValue);
noSmallStructures = imopen(noDarkCars, sedisk);
noSmallStructures = bwareaopen(noSmallStructures, 150);
% 删除二进制图像中像素小于150的所有连通部分,强化开操作
taggedCars(:,:,:,k) = singleFrame;
stats = regionprops(noSmallStructures, {'Centroid','Area'});
% 统计被标记的区域的面积分布
if ~isempty([stats.Area])
areaArray = [stats.Area];
[junk,idx] = max(areaArray);
c = stats(idx).Centroid;
c = floor(fliplr(c));
width = 2;
% 添加一块红色方块
row = c(1)-width:c(1)+width;
col = c(2)-width:c(2)+width;
taggedCars(row,col,1,k) = 255;
taggedCars(row,col,2,k) = 0;
taggedCars(row,col,3,k) = 0;
end
end
%% 把处理完的图片播放为视频
frameRate = trafficVid.FrameRate;
implay(taggedCars,frameRate);
相关文件均属matlab自带,直接运行即可