Clean noisy data from images
14 views (last 30 days)
Show older comments
alberto tonizzo
on 4 Apr 2024
Commented: Mathieu NOE
on 16 Apr 2024
Hey there,
I've been working with some images, averaging them out and plotting against depth (check out the code below). I'm trying to tidy up the data by getting rid of points that don't fit an exponential curve I've fitted to it. I've tried a couple of methods like filloutliers and sgolayfilt, but they haven't been working out too well. I used polyfit(depth_Sony, log(img_B_Masked_avg), 1) to fit the blue ('B') channel averages but the fit is not good because of the points that are off.
Any suggestions on a better approach? Thanks a bunch!
figure;
semilogy(depth_Sony, img_gray_Masked_avg, 'ko', 'MarkerSize', ms);
hold on;
semilogy(depth_Sony, img_R_Masked_avg, 'ro', 'MarkerSize', ms);
semilogy(depth_Sony, img_G_Masked_avg, 'go', 'MarkerSize', ms);
semilogy(depth_Sony, img_B_Masked_avg, 'bo', 'MarkerSize', ms);
xlabel('depth');
ylabel('mask avg value');
xlim([0 10]);
ylim([0.5*10^-1 10^1]);
2 Comments
cui,xingxing
on 5 Apr 2024
Based on your description, image denoising the code you posted I don't see any direct relationship.
Actually MATLAB already contains many methods, traditional and deep learning cases are as follows:
Accepted Answer
Mathieu NOE
on 15 Apr 2024
hello
this is a simple exponential fit using polyfit
I had to do a bit of manual tweaks first to slect the appropriate data
here an example on the "blue" curve
figure;
ms = 2;
ind = depth_Sony>2.5 & depth_Sony<8.5; % select valid x range (avoid large clouds)
xx = depth_Sony(ind);
yy = img_B_Masked_avg(ind);
[yy,k] = rmoutliers(yy, 'movmedian', 300, 'ThresholdFactor', 2); % remove large dips
xx(k) = [];
[b,m] = myexpfit(xx,yy); % see function below
img_B_Masked_fit = b*exp(depth_Sony*m);
semilogy(depth_Sony, img_B_Masked_avg, 'bo',xx, yy, '*r',depth_Sony, img_B_Masked_fit, 'g--', 'MarkerSize', ms);
TE = sprintf('C = %0.2fe^{%0.3ft}',b, m);
legend('raw data','extracted data',TE);
xlabel('depth');
ylabel('mask avg value');
% xlim([0 10]);
% ylim([0.5*10^-1 10^1]);
%%%%%%%%%%%
function [b,m] = myexpfit(x,y)
% exponential fit using polyfit
P = polyfit(x, log(y), 1);
m = P(1);
b = exp(P(2));
% yfit = b*exp(x*m);
end
2 Comments
More Answers (0)
See Also
Categories
Find more on Interpolation in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!