exponenta event banner

Выполнение пороговых и морфологических операций на GPU

В этом примере показано, как выполнять операции обработки изображений на графическом процессоре. В примере используется фильтрация для выделения водянистых областей на аэрофотоснимке.

Чтение и отображение изображения.

imOriginal = imread('concordaerial.png');
imshow(imOriginal)

Перемещение изображения в графический процессор путем создания gpuArray (Панель параллельных вычислений).

imGPUoriginal = gpuArray(imOriginal);

На этапе предварительной обработки измените изображение RGB на изображение в градациях серого. rgb2gray выполняет операцию преобразования для графического процессора, поскольку входной аргумент является gpuArray.

imGPUgray = rgb2gray(imGPUoriginal);

Просмотрите изображение в приложении Image Viewer и проверьте значения пикселов, чтобы найти значение водянистых областей. Для использования средства просмотра изображений необходимо вернуть данные изображения на ЦП с помощью gather (Панель параллельных вычислений). При наведении курсора мыши на изображение можно просмотреть значение пикселя под курсором в нижней части окна «Просмотр изображений». На изображении области воды темны и имеют значения пикселей менее 70.

imtool(gather(imGPUgray));

Чтобы получить новое изображение, содержащее только пикселы со значениями меньше 70, пороговое значение изображения на GPU.

imWaterGPU = imGPUgray<70;

Отображение порогового изображения. В отличие от средства просмотра изображений, imshow поддержка функций gpuArray вход.

figure
imshow(imWaterGPU)

Удаление небольших объектов из изображения с сохранением формы и размера больших объектов с помощью морфологического проема. imopen функция выполняет морфологическое вскрытие и поддерживает gpuArray вход.

imWaterMask = imopen(imWaterGPU,strel('disk',5));
imshow(imWaterMask)

Создайте копию исходного изображения, которое будет содержать расширенные данные. Преобразовать тип данных в single.

imGPUenhanced = im2single(imGPUoriginal);

Получите синий канал из исходного изображения.

blueChannelOriginal = imGPUenhanced(:,:,3);

Увеличение насыщенности синего канала путем увеличения интенсивности синего канала для пикселей, где маска 1 (true).

blueChannelEnhanced = blueChannelOriginal + 0.2*single(imWaterMask);

Максимальное значение расширенного синего канала превышает максимальное значение, ожидаемое для изображений типа данных single. Масштабирование данных до ожидаемого диапазона [0, 1] с помощью rescale функция.

blueChannelEnhanced = rescale(blueChannelEnhanced);

Замените синий канал на расширенный синий канал.

imGPUenhanced(:,:,3) = blueChannelEnhanced;

Отображение улучшенного изображения. Пиксели, соответствующие воде, имеют более насыщенный синий цвет в улучшенном изображении, чем в исходном изображении.

imshow(imGPUenhanced)
title('Enhanced Image')

После фильтрации изображения на GPU переместите данные обратно в CPU с помощью gather функция. Запишите измененное изображение в файл.

outCPU = gather(imGPUenhanced);
imwrite(outCPU,'concordwater.png')

См. также

(Панель инструментов параллельных вычислений) | (Панель инструментов параллельных вычислений)

Связанные примеры

Подробнее