Выполните пороговую обработку и морфологические операции на графическом процессоре

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

Считайте изображение в рабочую область.

imCPU = imread('concordaerial.png');

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

imGPUoriginal = gpuArray(imCPU);

Как шаг предварительной обработки, измените изображение 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)

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

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

montage({imCPU,imGPUenhanced})
title('Original Versus Enhanced Image')

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

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

Смотрите также

(Parallel Computing Toolbox) | (Parallel Computing Toolbox)

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

Больше о