用MATLAB进行图像处理

图像处理概念,算法和MATLAB

不要用Photoshop,用MATLAB !MATLAB图像效果(3)

欢迎客座博主回来布雷特Shoelson这是他关于在MATLAB中实现图像特效系列文章的延续。Brett是文件交换选择的一周博客他已经用MATLAB进行图像处理近20年了。

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

内容

把我放进动物园!

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

URL =“https://blogs.mathworks.com/pick/files/ElephantProfile.jpg”;img = imread(URL);colororeelephant = decorrstretch(img);coloreelephant = imadjust(coloreelephant,[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 = Img (Img,[0.20;0.80], [0.00;0.80, 1.10);hAx =轴;注意,我创建了一个轴句柄;我稍后会用到它。imshow (img);

接下来,我要分割长颈鹿的斑点。通常(但不总是),当我试图分割RGB图像时,我发现我可以得到一个很好的掩模,使用一个(有时是多个)灰度表示的彩色图像。我喜欢看单独的颜色平面,也喜欢看图像的不同颜色空间表示。ExploreRGB让探索变得简单:

正如我们在ExploreRGB GUI的这张图片中看到的,长颈鹿的斑点在HSV色彩空间的“饱和”平面上被很好地分割了。让我们从这里开始对斑点进行分割。

grayImg = rgb2hsv(img);grayImg = grayImg(:,:,2);(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,~] = size(grayImg);excludeMask = poly2mask(posns(:,1),posns(:,2),m,n);

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

spotMask = spotMask & ~excludeMask;

在显示结果时(左下),我意识到我手动修剪了蒙版,比我想要的更紧,所以我将它放大一点(imdilate),然后排除小区域(小于10个连接像素)使用bwareaopen.结果如下图所示。

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

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

spotMask =填充(spotMask,'holes');spotMask = imopen(spotMask,strel('disk',10));spotMask = imdilate(spotMask,strel('disk',10));spotMask = bwareaopen(spotMask,2000);

现在给斑点上色

从这一点开始,给斑点着色就相当简单了:我简单地标记斑点(bwlabel),并通过调用将标记的区域着色label2rgb.(另外,我指定“jet”作为我的colormap并使用“shuffle”命令随机分配地图颜色的点。)接下来,我设置"持有"属性的当前轴(即包含原始彩色图像的轴),并显示原始图像顶部的彩色点。最后,我修改了色点图像的“alphadata”属性,将其透明度设置为0.25。

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

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

imgenhenced = img;2 = 1:3 imgEnhanced(:,:,(二)= img (:,: ii) * (1-colortrans) + im2double (colormask(:,:,(二))* colortrans;结束

接下来:站在野外

所有图片版权归Brett Shoelson所有;经允许使用。




发布与MATLAB®R2012b

|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。