Этот пример показывает, как выполнить операции обработки изображений на графическом процессоре. Фильтрация использования в качестве примера, чтобы подсветить водянистые области на большой воздушной фотографии.
Считайте изображение в рабочую область.
imCPU = imread('concordaerial.png');
Переместите изображение в графический процессор путем создания объекта gpuArray
.
imGPU = gpuArray(imCPU);
Как шаг предварительной обработки, измените изображение RGB на полутоновое изображение. Поскольку вы передаете его gpuArray
, rgb2gray
выполняет операцию преобразования на графическом процессоре. Если вы передаете gpuArray
в качестве аргумента, то функция, которая была поддерживающей графический процессор, выполняет операцию на графическом процессоре.
imGPUgray = rgb2gray(imGPU);
Просмотрите изображение в Image Viewer и осмотрите пиксельные значения, чтобы найти значение водянистых областей. Обратите внимание на то, что необходимо возвратить данные изображения на центральный процессор, с помощью функции gather
, чтобы использовать Image Viewer. Когда вы перемещаете мышь через изображение, можно просмотреть значение пикселя под курсором в нижней части Image Viewer. В изображении области воды имеют пиксельные значения меньше чем 70.
imtool(gather(imGPUgray));
Отфильтруйте изображение на графическом процессоре, чтобы получить новое изображение, которое содержит только пиксели со значениями 70 или меньше, и просмотрите его.
imWaterGPU = imGPUgray<70; figure;imshow(imWaterGPU);
Используя морфологические операторы, которые поддерживаются на графическом процессоре, очистите рисунок маски путем удаления точек, которые не представляют воды.
imWaterMask = imopen(imWaterGPU,strel('disk',4)); imWaterMask = bwmorph(imWaterMask,'erode',3);
Размойте рисунок маски, с помощью imfilter
.
blurH = fspecial('gaussian',20,5);
imWaterMask = imfilter(single(imWaterMask)*10, blurH);
Повысьте синий канал, чтобы идентифицировать водянистые области.
blueChannel = imGPU(:,:,3); blueChannel = imlincomb(1, blueChannel,6, uint8(imWaterMask)); imGPU(:,:,3) = blueChannel;
Просмотрите результат. Функция imshow
может работать с изображениями на графическом процессоре.
figure;imshow(imGPU);
После фильтрации изображения на графическом процессоре положите обратно данные к центральному процессору с помощью функции gather
и запишите измененное изображение в файл.
outCPU = gather(imGPU);
imwrite(outCPU,'concordwater.png');