Clean noisy data from images

64 views (last 30 days)
alberto tonizzo
alberto tonizzo on 4 Apr 2024 at 14:37
Commented: Mathieu NOE on 16 Apr 2024 at 16:04
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
cui,xingxing on 5 Apr 2024 at 2:56
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:
alberto tonizzo
alberto tonizzo on 5 Apr 2024 at 14:07
Thank you @cui,xingxing the question is more about denoising this particular dataset. Notice that the variables "img_R_Masked_avg" are vectors, not images.

Sign in to comment.

Accepted Answer

Mathieu NOE
Mathieu NOE on 15 Apr 2024 at 12:35
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
alberto tonizzo
alberto tonizzo on 16 Apr 2024 at 15:59
Thank you! That looks good!
Mathieu NOE
Mathieu NOE on 16 Apr 2024 at 16:04
tx !
as always, my pleasure !

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!