2017-04-24 2 views
1

Gnoivce와 Hartmut은이 코드로 많은 도움을 주었지만 실행하는 데 시간이 오래 걸립니다. bar 명령의 CData 속성이을 사용하는 Octave 4.0-4.2.1 버전에서 구현되지 않은 것 같습니다. 이를 해결하기 위해 모든 단일 막대를 개별적으로 플롯하고 각 막대마다 개별 색상을 설정했습니다. 사람들은 나를 도왔고 지금까지 나를 잡았습니다. 5 분 플롯을 보여줄 사람이 누구보다 빨리 속도를 낼 수 있을까요?Octave/Matlab 플롯 가속화

다음 코드를 실행합니다 : marbles.jpg

clear all,clf reset,tic,clc 
rgbImage = imread('/tmp/marbles.jpg'); 
hsvImage = rgb2hsv(rgbImage);   % Convert the image to HSV space 
hPlane = 360.*hsvImage(:, :, 1);  % Get the hue plane scaled from 0 to 360 
binEdges = 0:360;     %# Edges of histogram bins 
N = histc(hPlane(:),binEdges); %# Bin the pixel hues from above 

C = colormap(hsv(360)); %# create an HSV color map with 360 points 
stepsize = 1; % stepsize 1 runs for a while... 

for n=binEdges(2:stepsize:end) %# Plot the histogram, one bar each 
    if (n==1), hold on, end 
    h=bar(n,N(n)); 
    set(h,'FaceColor',C(n,:)); %# set the bar color individually 
end 

axis([0 360 0 max(N)]);   %# Change the axes limits 
set(gca,'Color','k');    %# Change the axes background color 
set(gcf,'Pos',[50 400 560 200]); %# Change the figure size 
xlabel('HSV hue (in degrees)'); %# Add an x label 
ylabel('Bin counts');    %# Add a y label 
fprintf('\nfinally Done-elapsed time -%4.4fsec- or -%4.4fmins- or -%4.4fhours-\n',toc,toc/60,toc/3600); 

플롯은 5 분 후에 생성 : marbles.jpg 이미지 파일은 아래 사용 Plot

내가 'original question

+0

코드의 어느 부분이 오래 걸리는지 확인해 봤습니까? 그것은 루프인가? – gnovice

+0

@gnovice 네,'stepsize = 1; % stepsize 1이 잠시 동안 실행됩니다.'stepsize가 10으로 설정되면 시간이 증가하게됩니다. '더 빠르지 만 막대 사이에 빈 공간이 남습니다. –

+2

바 플롯 대신 이미지를 생성하지 않는 이유는 무엇입니까? – Andy

답변

3

원래의 질문을 보려면 루프를 추측하는 것은 너무 오래 걸리는 코드의 병목 현상입니까? 옥타브 4.0에서 나를 위해 바로 렌더링이 수정과 코드를 반복

h = bar(binEdges(1:end-1), N(1:end-1), 'histc'); % hggroup object 
set(h, 'FaceColor', 'flat', 'EdgeColor', 'none'); 
hPatch = get(h, 'Children');      % patch object 
set(hPatch, 'CData', 1:360, 'CDataMapping', 'direct'); 

: 당신은 hggroup 객체와 그 자식 patch 객체를 수정하는 set를 호출 한 후, bar 하나의 호출로 플롯을 루프를 제거하고 만들 수 있습니다 0.3 : 내가 코멘트에서 제안한 것처럼

enter image description here

2

, 나는 이미지를 사용 (이미지 내 시스템에 0.12s 소요) 것입니다.

편집 : 더 코멘트, 스텝 사이즈와 쓰레기통을 만들 수 있도록, 약간의 버그를 수정> 위와 같지만 빈 폭 1과 동일 output generated by script

1

img_fn = "17S9PUK.jpg"; 
if (! exist (img_fn, "file")) 
    disp ("downloading image from imgur.com..."); 
    fflush (stdout); 
    urlwrite ("http://i.imgur.com/17S9PUK.jpg", "17S9PUK.jpg"); 
endif 

rgbImage = imread (img_fn); 

## for debugging so the matrixes fit on screen 
if (0) 
    pkg load image 
    rgbImage = imresize (rgbImage, [6 8]); 
endif 

hsvImage = rgb2hsv(rgbImage); 
hPlane = 360 .* hsvImage(:, :, 1); 

## create bins, I've choosen 2 step to "smooth" the result 
binEdges = 1:2:360; 
N = histc (hPlane(:), binEdges)'; 

cm = permute (hsv (numel (binEdges)), [3 1 2]); 

## Create an image with x = hue 
img = repmat (cm, max(N), 1); 

## Create binary mask which is used to black "img" dependent on N 
sp = sparse (N(N > 0), (1:360)(N > 0), true, max(N), numel (binEdges)); 
mask = full (cumsum (flipud (sp))); 

## extend mask in depth to suppress RGB 
mask = repmat (mask, [1 1 3]); 

## use inverted mask to "black out" pixels < N 
img(logical (1 - flipud (mask))) = 0; 

## show image 
image (binEdges, 1:max(N), img) 
set (gca, "ydir", "normal"); 
xlabel('HSV hue (in degrees)'); 
ylabel('Bin counts'); 

## print it for stackoverflow 
print ("out.png") 

은 (경과 시간은 0.167423 초입니다.)

binEdges = 1:360; 

bin width 1

+0

아를 클릭 한 것 같아요. 버그, 일회용으로 인해 최대 피크가 누락되었습니다 ... – Andy

+1

버그가 최신 코드 – Andy

+0

에 수정되었습니다. @Rick T : 빠른 답변을 제공하는 벤치 마크를 수행 했습니까? 귀하의 질문에 "속도"가 실제 목표 였기 때문입니다. – Andy