Replacing small sections of a logical vector

1 Ansicht (letzte 30 Tage)
CarrotCakeIsYum
CarrotCakeIsYum am 25 Nov. 2016
Beantwortet: Jan am 25 Nov. 2016
I'm working with EMG data to determine when muscles activate in a group of disabled people.
After data processing I end up with a logical vector, of 1s where the muscle in 'on', and 0s where the muscle is 'off', for example:
EMG = 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Periods of three 1s or less in a row are likely to be artefact, and I need to replace them with 0s. E.g. to make the above into:
EMG = 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Any help is greatly appreciated!

Antworten (4)

Image Analyst
Image Analyst am 25 Nov. 2016
It's a one-liner if you have the Image Processing Toolbox since there is a function made specially to do that operation:
EMG = bwareaopen(EMG, 4); % Keep runs of 1's that are 4 or longer.

Alexandra Harkai
Alexandra Harkai am 25 Nov. 2016
There are a few different ways to do it.
This method may be frowned upon, but it nonetheless produces the required output:
n = 3; % max length of artefact periods
s = char(EMG+65); % converting 0-1 data to A-B string
for j=1:n
% get rid of periods of length j
s = strrep(s, ['A', repmat('B',1,n), 'A'], [repmat('A',1,n+2)]);
end
res = double(s)-65; % converting back to logical values

Andrei Bobrov
Andrei Bobrov am 25 Nov. 2016
Bearbeitet: Andrei Bobrov am 25 Nov. 2016
v = bwlabel(EMG);
EMG(ismember(v,find(accumarray(v(:)+1,1)<=3)-1)) = 0;

Jan
Jan am 25 Nov. 2016
[B, N] = RunLength(EMG);
B(N <= 3) = 0;
EMG2 = RunLength(B, N);

Kategorien

Mehr zu MATLAB finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by