Clean noisy data from images
14 ビュー (過去 30 日間)
古いコメントを表示
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 件のコメント
cui,xingxing
2024 年 4 月 5 日
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:
採用された回答
Mathieu NOE
2024 年 4 月 15 日
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 件のコメント
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Interpolation についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!