В этом примере показано, как выполнить операции обработки изображений на графическом процессоре. Пример использует фильтрацию, чтобы выделить водянистые области на воздушной фотографии.
Чтение и отображение изображения.
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')
gather
(Parallel Computing Toolbox) | gpuArray
(Parallel Computing Toolbox)