Исправление базовой линии изображения Matlab (удаление смещения)

#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).

Удаление постоянного тока 1

 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: использование наименьшей интенсивности для вычисления смещения

Изображение удаления смещения 1

Тестовое изображение 2: использование среднего / среднего для вычисления смещения

Изображение удаления смещения 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, верно? Затем вычитаем это из фактического изображения.