这个例子展示了如何在GPU上执行图像处理操作。这个例子使用过滤来突出航空照片中有水的区域。
读取并显示图像。
imOriginal = imread (“concordaerial.png”);imshow (imOriginal)
通过创建图形处理器将图像移动到GPUgpuArray
(并行计算工具箱)对象。
imGPUoriginal = gpuArray (imOriginal);
作为预处理步骤,将RGB图像转换为灰度图像。rgb2gray
在GPU上执行转换操作,因为输入参数是gpuArray
.
imGPUgray = rgb2gray (imGPUoriginal);
查看图片图像查看器应用程序并检查像素值,找到水域的值。要使用图像查看器,您必须通过使用收集
(并行计算工具箱)函数。当您将鼠标移动到图像上时,您可以在图像查看器的底部查看光标下的像素值。在图像中,水的区域是黑色的,像素值小于70。
imtool(收集(imGPUgray));
为了得到一个新图像,只包含值小于70的像素,在GPU上设置图像的阈值。
imWaterGPU = imGPUgray < 70;
显示阈值图像。不像图像查看器,imshow
功能支持金宝appgpuArray
输入。
图imshow (imWaterGPU)
使用形态学开口将小物体从图像中移除,同时保留较大物体的形状和大小。的imopen
功能执行形态开放和支持金宝appgpuArray
输入。
imWaterMask = imopen (imWaterGPU strel (“磁盘”5));imshow (imWaterMask)
创建包含增强数据的原始图像的副本。将数据类型转换为单
.
imGPUenhanced = im2single (imGPUoriginal);
从原始图像中得到蓝色通道。
blueChannelOriginal = imGPUenhanced (:: 3);
通过增加蒙版所在像素的蓝色通道的强度来增强蓝色通道的饱和度1
(真正的
).
blueChannelEnhanced = blueChannelOriginal + 0.2*single(imWaterMask);
增强后的蓝色通道的最大值超过了数据类型图像的最大值单
.属性将数据重新缩放到预期范围[0,1]重新调节
函数。
blueChannelEnhanced =重新调节(blueChannelEnhanced);
用增强的蓝色通道替换蓝色通道。
imGPUenhanced (:,:, 3) = blueChannelEnhanced;
显示增强后的图像。与原始图像相比,增强后的图像中与水对应的像素具有更饱和的蓝色。
imshow (imGPUenhanced)标题(“增强的图像”)
在GPU上对图像进行过滤后,将数据移回CPU收集
函数。将修改后的映像写入文件。
outCPU =收集(imGPUenhanced);imwrite (outCPU“concordwater.png”)