Clean noisy data from images
    7 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
  xingxingcui
      
 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 Smoothing 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!
