Если я вас правильно понял, вы хотите извлечь синий график ЭКГ, удалив текст и оси. Лучший способ сделать это - изучить цветовое пространство HSV изображения. Цветовое пространство HSV отлично подходит для различения цветов, как это делают люди. Мы ясно видим, что на изображении есть два разных цвета.
Мы можем преобразовать изображение в HSV, используя rgb2hsv, и мы можем изучить компоненты отдельно. Компонент оттенка представляет доминирующий цвет пикселя, насыщенность обозначает чистоту или количество белого света в пикселе, а значение представляет интенсивность или силу пикселя.
Попробуйте визуализировать, как каждый канал делает:
im = imread('http://i.stack.imgur.com/cFOSp.png'); %// Read in your image
hsv = rgb2hsv(im);
figure;
subplot(1,3,1); imshow(hsv(:,:,1)); title('Hue');
subplot(1,3,2); imshow(hsv(:,:,2)); title('Saturation');
subplot(1,3,3); imshow(hsv(:,:,3)); title('Value');

Хм ... ну, оттенок и насыщенность нам совершенно не помогают. Он говорит нам, что доминирующий цвет и насыщенность одинаковы ... но их отличает значение. Если вы посмотрите на изображение справа, мы сможем отличить их друг от друга по силе самого цвета. Это говорит нам о том, что «черные» пиксели на самом деле синие, но с ними почти не связана сила.
Мы действительно можем использовать это в наших интересах. Любые пиксели, значения которых превышают определенное значение, являются значениями, которые мы хотим сохранить.
Попробуйте установить порог ... что-то вроде 0.75. Динамический диапазон MATLAB значений HSV от [0-1], поэтому:
mask = hsv(:,:,3) > 0.75;
Когда мы устанавливаем пороговое значение для компонента значения, мы получаем следующее:

Очевидно, есть небольшой шум квантования ... особенно вокруг осей и шрифта. Что я собираюсь сделать дальше, так это выполнить морфологическую эрозию, чтобы устранить шум квантования вокруг каждого из чисел и осей. Я собираюсь сделать маску немного больше, чтобы убрать этот шум. Используя панель инструментов обработки изображений:
se = strel('square', 5);
mask_erode = imerode(mask, se);
Получаем вот что:

Отлично, теперь я собираюсь сделать копию вашего исходного изображения, а затем установить любой черный пиксель из полученной мной маски (см. Выше) на белый в окончательном изображении. Все остальные пиксели должны остаться нетронутыми. Таким образом, мы можем удалить любой текст и оси, которые видны на вашем изображении:
im_final = im;
mask_final = repmat(mask_erode, [1 1 3]);
im_final(~mask_final) = 255;
Мне нужно воспроизвести маску в третьем измерении, потому что это цветное изображение, и мне нужно установить для каждого канала значение 255 одновременно в тех же пространственных положениях.
Когда я это делаю, то получаю:

Теперь вы заметите, что на графике есть пробелы ... чего и следовало ожидать из-за шума квантования. Мы можем сделать что-то еще, преобразовав это изображение в оттенки серого и установив пороговое значение для изображения, а затем заполнив, соединяя края вместе с помощью морфологического расширения. Это безопасно, потому что мы уже удалили оси и текст. Затем мы можем использовать это как маску для индексации исходного изображения, чтобы получить окончательный график.
Что-то вроде этого:
im2 = rgb2gray(im_final);
thresh = im2 < 200;
se = strel('line', 10, 90);
im_dilate = imdilate(thresh, se);
mask2 = repmat(im_dilate, [1 1 3]);
im_final_final = 255*ones(size(im), class(im));
im_final_final(mask2) = im(mask2);
Я ограничиваю предыдущее изображение, которое мы получили без текста и осей, после того, как конвертирую его в оттенки серого, а затем выполняю растяжение с помощью элемента структурирования линии, который находится под углом 90 градусов, чтобы соединить те линии, которые изначально были отключен. Это пороговое изображение будет содержать пиксели, которые нам в конечном итоге понадобятся для выборки из исходного изображения, чтобы мы могли получить нужные нам данные графика.
Затем я беру эту маску, реплицирую ее, делаю полностью белое изображение, а затем пробую из исходного изображения и помещаю места, которые мы хотим из исходного изображения, в белое изображение.
Это наше окончательное изображение:

Очень хорошо! Мне пришлось выполнить всю эту обработку изображения, потому что ваше изображение изначально имеет шум квантования, поэтому будет немного сложнее получить график целиком. Андер Бигури в своем ответе более подробно объяснил шум квантования цвета, поэтому обязательно ознакомьтесь с его публикацией для получения более подробной информации.
Однако в качестве качественной меры мы можем вычесть это изображение из исходного изображения и посмотреть, что осталось:
imshow(rgb2gray(abs(double(im) - double(im_final_final))));
Мы получили:

Таким образом, похоже, что оси и текст удалены нормально, но на графике есть некоторые следы, которые мы не захватили с исходного изображения, и это имеет смысл. Все это связано с правильными пороговыми значениями, которые вы хотите выбрать, чтобы получить данные графика. В начале графика есть несколько проблемных участков, вероятно, из-за проведенной мной морфологической обработки. Это изображение, которое вы предоставили, довольно сложно из-за шума квантования, поэтому будет очень сложно получить идеальный результат. Кроме того, к сожалению, все эти пороговые значения являются эвристическими, поэтому поиграйте с порогами, пока не получите что-то, что с вами согласуется.
Удачи!
person
rayryeng
schedule
22.04.2015