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

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

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

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

Переместите изображение в графический процессор путем создания gpuArray (Parallel Computing Toolbox) объект.

imGPUoriginal = gpuArray(imOriginal);

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

imGPUgray = rgb2gray(imGPUoriginal);

Просмотрите изображение в приложении Image Viewer и проверьте значения пикселей, чтобы найти значение водянистых областей. Чтобы использовать Image Viewer, необходимо вернуть данные изображения на центральный процессор с помощью gather (Parallel Computing Toolbox) функция. Когда вы перемещаете мышь над изображением, можно просмотреть значение пикселя под курсором в нижней части Image Viewer. На изображении области воды темные и имеют пиксельные значения менее 70.

imtool(gather(imGPUgray));

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

imWaterGPU = imGPUgray<70;

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

figure
imshow(imWaterGPU)

Удалите небольшие предметы из изображения с сохранением формы и размера больших объектов с помощью морфологического открытия. The 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')

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

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

См. также

(Parallel Computing Toolbox) | (Parallel Computing Toolbox)

Похожие примеры

Подробнее о