用MATLAB进行图像处理

图像处理概念、算法和MATLAB

不要用Photoshop,用MATLAB !与MATLAB的图像效果(第3部分)

我想欢迎回来的客座博主Brett Shoelson.这是他在MATLAB中实现图像特效系列文章的续篇。Brett说本周文件交换精选博客他已经用MATLAB进行图像处理近20年了。

(第1部分)(第2部分)(第3部分)(第4部分)

内容

把我放进动物园!

到目前为止(文章1文章2在这个用MATLAB创建特殊图像效果的系列中,我已经将过程应用到整个图像中。例如,我在上面的图片中使用了我之前的文章中使用的对比度增强的大象。我通过去关联拉伸(使用去脱离)得到的图像。然后我增强了一点颜色imadjust.

URL =.“https://blogs.mathworks.com/pick/files/ElephantProfile.jpg”;img = imread (URL);colorElephant = decorrstretch (img);colorElephant = imadjust (colorElephant, 0.10;0.79], [0.00;1.00, 1.10);

(去序拉伸可用于通过减少图像中的平面间自相关级别来可视化,有时分析图像。它通常与多光谱或高光谱图像一起使用。)

在这篇文章中,我想给长颈鹿拍一张普通的照片,并对它进行修改,让长颈鹿有一些不寻常的东西。但为了做到这一点,我需要这个图像——创建一个二进制掩码,在我感兴趣的区域的位置是1,在其他地方是0。有许多分割图像的方法 - 事实上,有许多方法图像处理工具箱.例如,如果我们想给长颈鹿的斑点上色,我们首先必须找到一个合适的方法来分割斑点。(毫无疑问,得到一个好的分割是许多图像处理问题中最困难的部分!)

首先,让我们阅读和调整长颈鹿的形象。

URL =.“https://blogs.mathworks.com/pick/files/GiraffeProfile.jpg”;img = im2double (imread (URL));img = imadjust (img, 0.20;0.80], [0.00;0.80, 1.10);hAx =轴;注意,我创建了一个轴的句柄;我稍后会用到它。imshow(img);

接下来,我想分割长颈鹿的斑点。通常(但并不总是),当我尝试分割RGB图像时,我发现我可以使用彩色图像的一个(或有时多个)灰度表示工作的好的面具。我也喜欢看看图像的不同颜色展示。ExploreRGB让探索变得简单:

正如我们在普通的这种形象中看到的那样,长颈鹿的斑点在HSV色彩空间的“饱和”平面中为我们分段得很好。所以让我们从那里开始我们的斑点。

grayImg = rgb2hsv (img);grayImg = grayImg (:: 2);grayImg = imadjust (grayImg, 0.6;1.0], [0.00;1.00, 1.00);spotMask = im2bw (grayImg graythresh (grayImg));

现在,如果我对作为分割面具的满意,我可以继续前进。但我只想要长颈鹿的斑点 - 而不是头部或鬃毛。我可以继续尝试不同的程序方法;请记住,我可以以任何有意义的方式结合这些逻辑面具。但相反,我将从Photoshop中获取我的第一个提示,然后去老学校:我要手动排除我不想着色的长颈鹿的一部分。那我该怎么做?

imfreehand救援!

几年后(R2008A,我相信),我们改进了我们兴趣区(ROI)工具。我想绘制一名手绘域,并用它来帮助掩盖我的图像。所以,使用imfreehand,我很快围绕着我想要排除的地区。(我说“很快,”,但你一般想带着这一步的时间;获得一个好的细分面膜对获得良好效果至关重要!)

要创建手动掩码:

manualMask = imfreehand;posns = getPosition (manualMask);[m, n, ~] =大小(grayImg);excludeMask = poly2mask (posns (: 1), posns (:, 2), m, n);

现在我可以把它和我原来的斑点面具结合起来,用逻辑组合“……,而不是……":

Spotmask = Spotmask&〜另外的方式;

在显示结果(下面的左侧)时,我识别出我手动修剪掩码比我预期的更紧,所以我会向它扩张一下(imdilate),然后排除小区(少于10个连接的像素)使用bwareaopen.结果如下图所示。

spotMask = spotMask & imdilate(~excludeMask,strel(“磁盘”2));spotMask = bwareaopen (spotMask 10);

这和我想要的蒙版很接近,但是我要稍微调整一下,在斑点上填洞(imfill),并通过一些形态操作(MorphTool再次!)。还有一个应用bwareaopen(这次,只保持非常大的Blob),我有分割面具看起来我想要的方式。

Spotmask = Imfill(Spotmask,'孔');Spotmask = Imopen(Spotmask,Strel('磁盘',10));Spotmask = Imdilate(Spotmask,Strel('磁盘',10));Spotmask = Bwareaopen(Spotmask,2000);

现在来给斑点上色

从这一点来看,着色斑点相当简单:我简单地标记了斑点(bwlabel),并通过调用label2rgb.(此外,我指定“jet”作为我的COLOROMAP.并使用“Shuffle”命令随机将地图颜色随机分配给斑点。)接下来,我设置了“抓住”当前轴的特性(即包含原始彩色图像的一个),并在原始图像的顶部显示彩色斑点。最后,我修改了彩色点图像的“Alphadata”属性,将其透明度设置为0.25。

L = bwlabel (spotMask);colormask = label2rgb(L,jet(max(L(:)))),[0 0 0],“洗牌”);%对包含原始图像的轴使用手柄,使%设置当前轴,并设置其“保持”属性为on。轴(hAx)h = imshow (colormask);我在这里也创建了一个句柄。Colortrans = 0.25;套(H,“alphadata”, colortrans);

现在剩下的就是以RGB图像的形式捕获可视化。我将简单地从原始长颈鹿图像的副本开始,并通过colorplane-by-colorplane修改它,按0.75缩放每个(即1-colortrans),并添加彩色斑点图像的缩放RGB组件:

imgEnhanced = img;II = 1:3 IMGENHANCED(:,:,ii)= IMG(:,ii)*(1-colortrans)+ im2double(colormask(:,:,ii))* colortrans;结束

下一个:站在田野里

所有图片版权所有Brett Shoelson;使用许可。




发布与MATLAB®R2012b

|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。