要在 Matlab 中刷新 imshow?

To refresh imshow in Matlab?

我想将此答案的 code 转换为 imshow。 它通过

在 MOVIE2AVI 中创建电影
%# preallocate
nFrames = 20;
mov(1:nFrames) = struct('cdata',[], 'colormap',[]);
%# create movie
for k=1:nFrames
   surf(sin(2*pi*k/20)*Z, Z)
   mov(k) = getframe(gca);
end
close(gcf)
movie2avi(mov, 'myPeaks1.avi', 'compression','None', 'fps',10);

我的伪代码

%# preallocate
nFrames = 20;
mov(1:nFrames) = struct('cdata',[], 'colormap',[]);
%# create movie
for k=1:nFrames
    imshow(signal(:,k,:),[1 1 1]) % or simply imshow(signal(:,k,:))
    drawnow
    mov(k) = getframe(gca);
end
close(gcf) 
movie2avi(mov, 'myPeaks1.avi', 'compression','None', 'fps',10);

然而,这在屏幕上创建了动画,但它只保存了一个大小为 0 kB 的 AVI 文件。文件 myPeaks1.avi 在 运行 surf 命令之后正确存储,但不是来自 imshow。 我不确定命令 drawnow

实际案例代码

%% HSV 3rd version 
% 
rgbImage = imread('http://i.stack.imgur.com/cFOSp.png');
% Extract blue using HSV 
hsvImage=rgb2hsv(rgbImage);
I=rgbImage;
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
R((hsvImage(:,:,1)>(280/360))|(hsvImage(:,:,1)<(200/360)))=255;
G((hsvImage(:,:,1)>(280/360))|(hsvImage(:,:,1)<(200/360)))=255;
B((hsvImage(:,:,1)>(280/360))|(hsvImage(:,:,1)<(200/360)))=255;
I2= cat(3, R, G, B);

% Binarize image, getting all the pixels that are "blue"
bw=im2bw(rgb2gray(I2),0.9999);

% The label most repeated will be the signal. 
% So we find it and separate the background from the signal using label.
% Label each "blob"
lbl=bwlabel(~bw);

% Find the blob with the highes amount of data. That will be your signal.
r=histc(lbl(:),1:max(lbl(:)));
[~,idxmax]=max(r);
% Profit!
signal=rgbImage;
signal(repmat((lbl~=idxmax),[1 1 3]))=255;
background=rgbImage;
background(repmat((lbl==idxmax),[1 1 3]))=255;

%% Error Testing
comp_image = rgb2gray(abs(double(rgbImage) - double(signal)));
if ( sum(sum(comp_image(32:438, 96:517))) > 0 )
    break; 
end

%% Video       
% 5001 units so 13.90 (= 4.45 + 9.45) seconds. 
% In RGB, original size 480x592. 
% Resize to 480x491
signal = signal(:, 42:532, :); 
% Show 7 seconds (298 units) at a time. 
% imshow(signal(:, 1:298, :)); 

%% Video VideoWriter
% movie2avi deprecated in Matlab
% 
% 
%# figure
hFig = figure('Menubar','none', 'Color','white');
Z = peaks; 
h = imshow(Z, [], 'InitialMagnification',1000, 'Border','tight');
colormap parula; axis tight manual off; 
set(gca, 'nextplot','replacechildren', 'Visible','off');
% set(gcf,'Renderer','zbuffer'); % on some Windows


%# preallocate
N = 40; % 491;
vidObj = VideoWriter('myPeaks3.avi');
vidObj.Quality = 100;
vidObj.FrameRate = 10;
open(vidObj);

%# create movie
for k=1:N
   set(h, 'CData', signal(:,k:k+40,:))
   % drawnow
   writeVideo(vidObj, getframe(gca));
end

%# save as AVI file
close(vidObj);

绘图功能怎么用imshow或者对应的代替? 如何正确存储动画?

这里有一些代码可以尝试:

%// plot
hFig = figure('Menubar','none', 'Color','white');
Z = peaks;
%h = surf(Z);
h = imshow(Z, [], 'InitialMagnification',1000, 'Border','tight');
colormap jet
axis tight manual off

%// preallocate movie structure
N = 40;
mov = struct('cdata',cell(1,N), 'colormap',cell(1,N));

%// aninmation
for k=1:N
   %set(h, 'ZData',sin(2*pi*k/N)*Z)
   set(h, 'CData',sin(2*pi*k/N)*Z)
   drawnow
   mov(k) = getframe(hFig);
end
close(hFig)

%// save AVI movie, and open video file
movie2avi(mov, 'file.avi', 'Compression','none', 'Fps',10);
winopen('file.avi')

结果(不是真正的视频,只是一个 GIF 动画):


根据您机器上安装的编解码器,您可以应用视频压缩,例如:

movie2avi(mov, 'file.avi', 'Compression','XVID', 'Quality',100, 'Fps',10);

(假设您安装了 Xvid 编码器)。


编辑:

这是我对您发布的代码的实现:

%%// extract blue ECG signal
%// retrieve picture: 
imgRGB = imread('http://i.stack.imgur.com/cFOSp.png');

%// detect axis lines and labels
imgHSV = rgb2hsv(imgRGB);
BW = (imgHSV(:,:,3) < 1);
BW = imclose(imclose(BW, strel('line',40,0)), strel('line',10,90));

%// clear those masked pixels by setting them to background white color
imgRGB2 = imgRGB;
imgRGB2(repmat(BW,[1 1 3])) = 255;

%%// create sliding-window video
len = 40;
signal = imgRGB2(:,42:532,:);
figure('Menubar','none', 'NumberTitle','off', 'Color','k')
hImg = imshow(signal(:,1:1+len,:), ...
    'InitialMagnification',100, 'Border','tight');

vid = VideoWriter('signal.avi');
vid.Quality = 100;
vid.FrameRate = 60;
open(vid);

N = size(signal,2);
for k=1:N-len
    set(hImg, 'CData',signal(:,k:k+len,:))
    writeVideo(vid, getframe());
end

close(vid);

结果如下所示: