#matlab #curve-fitting #baseline
#matlab #подгонка кривой #базовая линия
Вопрос:
У меня есть этот график:
и хотите сгладить его базовую линию / уменьшить смещение с помощью Matlab.
В основном, как коррекция базовой линии для спектра, но здесь у меня есть сетка, и я не могу понять, как сгладить ее базовую линию при работе с матрицей? В основном точка должна оставаться, но окружение фактически равно нулю. Однако шум может остаться.
Вот изображение:
Мне интересно, работает ли что-то подобное:
for x=1:1201
for y=1:1201
Ibasetest = polyfit(x,y,1);
end
end
Проще говоря, сделайте базовую линию для каждого X вдоль Y для Z данных. Но я не могу заставить его работать. 🙁
Комментарии:
1. Как бы вы поступили с простым сигналом? Какую технику удаления базовой линии вы бы использовали? Каков ваш ввод и каков ожидаемый результат?
2. Просто очень простой. Точка в середине должна остаться, но я хочу удалить смещение вокруг нее. На данный момент это смещение от 10 до 60. Это значение должно быть уменьшено до 0. Должна быть простая линейная подгонка. Остальное я могу узнать, поиграв.
3. Не могли бы вы опубликовать используемое вами входное изображение? Это может упростить игру и тестирование некоторых методов.
4. Прилагается 🙂 Таким образом, в основном темное окружение должно быть черным. Шум может остаться. Я просто хочу удалить смещение. Это не постоянное смещение по горизонтали (это было бы легко), но в базовой линии изображения есть наклон.
5. О, только что заметил ваш комментарий. Я постараюсь учесть наклон и отредактировать свой ответ.
Ответ №1:
Примечание: Другой метод, который нужно попробовать, может включать в себя скользящие / оконные средние для вычисления локальной величины для смещения.
Метод 1: дискретное косинусное преобразование (удаление смещения постоянного тока)
Преобразует изображение в частотную область с использованием дискретного преобразования Фурье (DCT). Удаляет коэффициент постоянного тока в верхнем левом углу (установленный равным нулю) матрицы и преобразует его обратно в пространственную область с помощью обратного дискретного преобразования Фурье (IDCT).
Image = imread("Test_Image.jpg");
%Converting image to greyscale if RGB image%
[Image_Height,Image_Width,Depth] = size(Image);
if(Depth == 3)
Image = rgb2gray(Image);
end
%Removing image offset%
Discrete_Cosine_Transformed_Image = dct2(Image);
Discrete_Cosine_Transformed_Image(1,1) = 0;
Inverse_Discrete_Cosine_Transformed_Image = idct2(Discrete_Cosine_Transformed_Image);
Calibrated_Image = medfilt2(Inverse_Discrete_Cosine_Transformed_Image,[20 20]);
% Plotting the original and thresholded image%
X_Axes = (1:1:Image_Height);
Y_Axes = (1:1:Image_Width);
subplot(1,2,1); surf(X_Axes,Y_Axes,Image,'EdgeColor','none');
title("Original Image Plot");
xlabel('X-Axis'); ylabel('Y-Label');
zlim([0 255]);
subplot(1,2,2); surf(X_Axes,Y_Axes,uint8(Calibrated_Image),'EdgeColor','none');
title("Calibrated Image Plot");
xlabel('X-Axis'); ylabel('Y-Label');
zlim([0 255]);
Ключевое дискретное косинусное преобразование (DCT), фильтрующее кодовые строки
%Removing image offset%
Discrete_Cosine_Transformed_Image = dct2(Image);
Discrete_Cosine_Transformed_Image(1,1) = 0;
Inverse_Discrete_Cosine_Transformed_Image = idct2(Discrete_Cosine_Transformed_Image)
Метод 2: стандартное равномерное смещение (без наклона)
Использует постоянное значение и вычитает его по всей матрице изображения.
Тестовое изображение 1: использование наименьшей интенсивности для вычисления смещения
Тестовое изображение 2: использование среднего / среднего для вычисления смещения
Image = imread("Circular_Image.png");
%Converting image to greyscale if RGB image%
[Image_Height,Image_Width,Depth] = size(Image);
if(Depth == 3)
Image = rgb2gray(Image);
end
%Removing image offset%
Lowest_Intensity_Value = min(Image,[],'all');
Average = mean(Image,'all');
Calibrated_Image = Image - Average;
% Plotting the original and thresholded image%
X_Axes = (1:1:Image_Height);
Y_Axes = (1:1:Image_Width);
subplot(1,2,1); surf(X_Axes,Y_Axes,Image,'EdgeColor','none');
title("Original Image Plot");
xlabel('X-Axis'); ylabel('Y-Label');
zlim([0 255]);
subplot(1,2,2); surf(X_Axes,Y_Axes,Calibrated_Image,'EdgeColor','none');
title("Calibrated Image Plot");
xlabel('X-Axis'); ylabel('Y-Label');
zlim([0 255]);
Использование версии MATLAB: R2019b
Комментарии:
1. Ну да ладно. Мне нужна была простая функция, удаляющая смещение / базовую линию, даже в виде линейной регрессии. Очень просто с линейными графиками, но я не могу сделать это с 2D.
2. @nolimits чувствует то же самое на этом. Я дам вам знать, если найду что-нибудь более краткое и простое.
3. Я пытался использовать цикл, который разрезает каждый X, Y и выполняет базовую матрицу вычитания, но на самом деле не сработал. % для x = 1:1201 % для y = 1:1201 % Ibasetest = polyfit(x, y,1); % конец % конец %
4. Это интересная идея, которую я должен изучить.
5. Я думал, что это дает линейную базовую линию для каждой линии X вдоль направления Y. В основном Y = 1200 графиков, имеющих линию. Тогда это должно быть сделано для каждого Y в направлении X, верно? Затем вычитаем это из фактического изображения.