Filtering outlier in 2D coordinate data

조회 수: 35(최근 30일)
BeeTiaw 2019년 5월 17일
댓글: Image Analyst 2019년 5월 19일
Hi experts,
I need your help to remove some outliers in my 2D coordinate data shown below.
At, at least, four locations, there are some outliers that need to be removed from my data. Please see some spikes in the plots (in red circles).
Does anyone have an algoritm, or can suggest one, that can be used to detect and move (or replace) those values?
Note that I may have several problems with slightly different cases, e.g. the number of points of the outliers may be more or less than the one shown here.
I have attached a txt file containing the 2D coordinate in this post.
  댓글 수: 6
BeeTiaw 2019년 5월 17일
I can assure you that the spikes will not more than, even, 10%. Let's just stick to the problem I have at the moment. Thanks.

댓글을 달려면 로그인하십시오.

채택된 답변

Image Analyst
Image Analyst 2019년 5월 17일
Well this works for "the problem I have at the moment", though there are even simpler methods, and more sophisticated methods. I think this one is a good mix:
clc; % Clear command window.
clear; % Delete all variables.
close all; % Close all figure windows except those created by imtool.
workspace; % Make sure the workspace panel is showing.
fontSize = 18;
markerSize = 10;
% Read in data.
data = load('Data.txt');
x = data(:,1);
y = data(:,2);
% Smooth the shape with a median filter.
windowWidth = 9;
% for windowWidth = 9 : 2 : 9 % Try different values
smoothedx = medfilt1(x, windowWidth);
smoothedy = medfilt1(y, windowWidth);
plot(x, y, 'b.-', 'MarkerSize', markerSize);
hold on;
plot(smoothedx, smoothedy, 'r.-', 'MarkerSize', markerSize);
grid on;
legend('Original', 'Smoothed');
caption = sprintf('Median Window Width = %d', windowWidth)
title(caption, 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0, 0.04, 1, 0.96]);
% end
% Find where shape deviates from smoothed shape the most.
residuals = sqrt((x-smoothedx) .^ 2 + (y - smoothedy) .^ 2);
plot(residuals, 'b.-', 'MarkerSize', markerSize);
title('Residuals', 'FontSize', fontSize);
grid on;
hold on;
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0, 0.04, 1, 0.96]);
% Find all residuals more than 0.01.
spikeIndexes = residuals > 0.01;
xSpike = x(spikeIndexes);
ySpike = y(spikeIndexes);
% Plot them
plot(x, y, 'b.-');
grid on;
hold on;
plot(xSpike, ySpike, 'ro', 'MarkerSize', markerSize);
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0, 0.04, 1, 0.96]);
0000 Screenshot.png
  댓글 수: 2
Image Analyst
Image Analyst 2019년 5월 19일
You're welcome. Thanks for accepting. Just realize that it may not work for shapes where the spikes are of different widths, and you might need to adjust the parameters until you get exactly 4 regions. You can determine the number of regions with either bwlabel() or findgroups().

댓글을 달려면 로그인하십시오.

추가 답변(0개)

Community Treasure Hunt

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

Start Hunting!

Translated by