В предыдущих ответах были предложены интересные математические методы удаления базовой линии. Но я предполагаю, что этот вопрос является продолжением вашего предыдущего вопросы, а под изображением вы подразумеваете, что ваши данные на самом деле являются изображением. Если это так, вы можете использовать методы обработки изображений, чтобы найти пики и сгладить области вокруг них.
![введите здесь описание изображения](https://i.stack.imgur.com/NBvOG.png)
<сильный>1. Предварительная обработка
Перед применением различных фильтров лучше сопоставить значения пикселей с определенным диапазоном. таким образом мы можем лучше контролировать значения необходимых параметров фильтров.
Сначала мы преобразуем тип данных изображения в double для случаев, когда значения пикселей являются целыми числами.
I = double(I);
Затем, применяя усредненный фильтр, мы уменьшаем шум на изображении.
SI = imfilter(I,fspecial('disk',40),'replicate');
Наконец, мы сопоставляем значения всех пикселей в диапазоне от нуля до единицы.
NI = SI-min(SI(:));
NI = NI/max(NI(:));
<сильный>2. Сегментация
После подготовки изображения мы можем определить части, в которых расположен каждый из пиков. Для этого мы сначала вычисляем градиент изображения.
G = imgradient(NI,'sobel');
Затем мы определяем части изображения, которые имеют более высокий наклон. Поскольку высокий наклон может иметь разное значение на разных изображениях, мы используем функцию graythresh
, чтобы разделить изображение на две части: низкий наклон и высокий наклон.
SA = im2bw(G, graythresh(G));
Сегментированные области на предыдущем шаге могут иметь несколько проблем:
- Небольшие непрерывные компоненты, которые классифицируются как часть области с большим уклоном, могут быть вызваны только шумом. Следовательно, компоненты с площадью меньше порогового значения должны быть удалены.
- Из-за того, что наклон достигает нуля на вершинах пиков, вероятно, в компонентах, найденных на предыдущем шаге, будут дыры.
- Наклон пика не обязательно одинаков по его границам, а найденные участки могут иметь неправильную форму. Одним из решений может быть расширение их путем замены их выпуклыми залами.
[L, nPeaks] = bwlabel(SA);
minArea = 0.03*numel(I);
P = false(size(I));
for i=1:nPeaks
P_i = bwconvhull(L==i);
area = sum(P_i(:));
if (area>minArea)
P = P|P_i;
end
end
<сильный>3. Удаление базовой линии
Матрица P
, рассчитанная на предыдущем шаге, содержит значение единицы на пиках и нулевое значение на остальных участках. Пока что мы можем удалить базовую линию, умножив эту матрицу на основном изображении. Но лучше предварительно смягчить края найденных областей, чтобы края пиков не свалились внезапно в ноль.
FC = imfilter(double(P),fspecial('disk',50),'replicate');
F = I.*FC;
Вы также можете сдвигать пики с наименьшим количеством изображения на их краях.
E = bwmorph(P, 'remove');
o = min(I(E));
T = max(0, F-o);
Все вышеперечисленные шаги в одной функции
function [hlink, T] = removeBaseline(I, demoSteps)
% converting image to double
I = double(I);
% smoothing image to reduce noise
SI = imfilter(I,fspecial('disk',40),'replicate');
% normalizing image in [0..1] range
NI = SI-min(SI(:));
NI = NI/max(NI(:));
% computng image gradient
G = imgradient(NI,'sobel');
% finding steep areas of the image
SA = im2bw(G, graythresh(G));
% segmenting image to find regions covered by each peak
[L, nPeaks] = bwlabel(SA);
% defining a threshold for minimum area covered by each peak
minArea = 0.03*numel(I);
% filling each of the regions, and eliminating small ones
P = false(size(I));
for i=1:nPeaks
% finding convex hull of the region
P_i = bwconvhull(L==i);
% computing area of the filled region
area = sum(P_i(:));
if (area>minArea)
% adding the region to peaks mask
P = P|P_i;
end
end
% applying the average filter on peaks mask to compute coefficients
FC = imfilter(double(P),fspecial('disk',50),'replicate');
% Removing baseline by multiplying the coefficients
F = I.*FC;
% finding edge of peaks
E = bwmorph(P, 'remove');
% finding minimum value of edges in the image
o = min(I(E));
% shifting the flattened image
T = max(0, F-o);
if demoSteps
figure
subplot 231, imshow(I, []); title('Original Image');
subplot 232, imshow(SI, []); title('Smoothed Image');
subplot 233, imshow(NI); title('Normalized in [0..1]');
subplot 234, imshow(G, []); title('Gradient of Image');
subplot 235, imshow(SA); title('Steep Areas');
subplot 236, imshow(P); title('Peaks');
figure;
subplot 221, imshow(FC); title('Flattening Coefficients');
subplot 222, imshow(F, []); title('Base Line Removed');
subplot 223, imshow(E); title('Peak Edge');
subplot 224, imshow(T, []); title('Final Result');
figure
h1 = subplot(1, 3, 1);
surf(I, 'edgecolor', 'none'); hold on;
contour3(I, 'k', 'levellist', o, 'linewidth', 2)
h2 = subplot(1, 3, 2);
surf(F, 'edgecolor', 'none'); hold on;
contour3(F, 'k', 'levellist', o, 'linewidth', 2)
h3 = subplot(1, 3, 3);
surf(T, 'edgecolor', 'none');
hlink = linkprop([h1 h2 h3],{'CameraPosition','CameraUpVector', 'xlim', 'ylim', 'zlim', 'clim'});
set(h1, 'zlim', [0 max(I(:))])
set(h1, 'ylim', [0 size(I, 1)])
set(h1, 'xlim', [0 size(I, 2)])
set(h1, 'clim', [0 max(I(:))])
end
end
Чтобы выполнить функцию с изображением, содержащим несколько пиков с шумом:
close all; clc; clear variables;
I = abs(peaks(1200));
J1 = imnoise(ones(size(I))*0.5,'salt & pepper', 0.05);
J1 = imfilter(double(J1),fspecial('disk',20),'replicate');
[X, Y] = meshgrid(linspace(0, 1, size(I, 2)), linspace(0, 1, size(I, 1)));
J2 = X.^3+Y.^2;
I = max(I, 2*J2) + 5*J1;
lp3 = removeBaseline(I, true);
Чтобы вызвать функцию для изображения, прочитанного из файла:
I = rgb2gray(imread('imagefile.jpg'));
[~, I2] = removeBaseline(I, true);
![введите здесь описание изображения](https://i.stack.imgur.com/opMb7.png)
![введите здесь описание изображения](https://i.stack.imgur.com/RSsVt.png)
![введите здесь описание изображения](https://i.stack.imgur.com/2oBiC.png)
Результаты для изображений, представленных в предыдущих вопросах:
![введите здесь описание изображения](https://i.stack.imgur.com/zgroB.png)
![введите здесь описание изображения](https://i.stack.imgur.com/pydCo.png)
person
saastn
schedule
13.10.2020