Steve用MATLAB进行图像处理

图像处理概念,算法,和MATLAB

不要ps它,MATLAB它!MATLAB图像效果(4)

欢迎客座博主回来布雷特Shoelson继续他在MATLAB中实现图像特效的系列帖子。布雷特是每周文件交换精选博客他已经用MATLAB进行图像处理近20年了。

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

内容

站在田野里

在本嘉宾系列的前三篇文章中(第1部分第2部分第3部分)我已经通过一些方法来用MATLAB创建特殊的图像效果。我从简单开始,并随着进展而增加难度。在这第四篇文章中,我将创建上面的斑马图像。你可能会猜到,这样做需要分割斑马——这当然是这个问题中最困难的部分。

我之前写过我可以通常在彩色图像的灰度表示上获得良好的分割掩码。虽然我支持这一说法,但我也要说,有时颜色提供创建分割掩码所需的良好信息。事实上,我将使用颜色来分割这张图片中的斑马,然后使用手动掩蔽方法(使用imfreehand-介导的方法,我在以前的帖子)微调蒙版。

分段的颜色

有几种使用颜色信息进行分割的方法。例如,如果我想创建一个用户选择颜色的蒙版,我可以使用impixelregion去探索一个区域的颜色,或者我可以调用impixel点击选择颜色样本。

注意|im2double|转换可以方便地将强度缩放到[0,1]URL =“https://blogs.mathworks.com/pick/files/ZebraInField.jpg”;img = im2double (imread (URL));图中,imshow (img);impixelregion

impixelregion提供了一个方便的工具,用于探索小矩形下面的RGB(或灰度)值;当您将该矩形拖动到图像上时,强度值将更新并显示在一个单独的图中。例如,在这张图片中,我们可以识别出草的RGB强度大约为[0.75 0.65 0.5]。通过指定0.05的“公差”(即颜色范围的5%),我们可以很容易地通过选择所有具有近似红、绿、蓝值的像素来创建一个“非斑马”蒙版:

targetColor = [0.75 0.65 0.5];公差= 0.05;掩码=...img(:,:,1) >= targetColor(1) -公差&...img(:,:,1) <= targetColor(1) +公差&...img(:,:,2) >= targetColor(2) -公差&...img(:,:,2) <= targetColor(2) +公差&...img(:,:,3) >= targetColor(3) -公差&...img(:,:,3) <= targetColor(3) +公差;图中,imshow(面具);标题(“不是斑马?”

这里要注意的是,二进制变量“mask”上的每个约束都只是我要应用的附加逻辑AND。我可以很容易地为R、G和b的上下范围提供不同的公差(一个GUI使用滑块可能会促进这种交互!)我还可以以类似的方式创建其他掩码,并使用逻辑OR操作将它们组合起来,直到实现所需的分割。

不过,我想演示另一种有用的颜色分割方法,而不是沿着那条路走下去。在这种方法中,我将让MATLAB来完成工作,而不是手动选择分割掩码的基础颜色。这个函数rgb2ind将图像量化为用户指定数量的颜色。每一个“量子能级”都可以用来创建图像的独特掩模。例如,这里我将斑马量化为16种颜色,并显示每个索引所代表的二进制掩码:

nColors = 16;X = rgb2ind (img, 16);% (X从0到nColors-1)ii = 0:nColors-1 subplot(4,4,ii+1) imshow(ismember(X,ii));标题(sprintf (“X = % d '(二));结束

现在,我可以构建斑马的分割掩码,只选择在感兴趣的区域内具有显著成分的指数:

掩码= ismember (X,[0、2、4、5、7,十12、14、15));图中,imshow(面具)

显然,在包含更多的指标来“固化”斑马蒙板和增加分割中包含的背景“噪声”数量之间存在权衡。我喜欢这样作为起点,所以我将使用它并开始细化:

掩码= bwareaopen(面具,100);%去除小斑点= imfill(面具,面具“黑洞”);%形态填补图中,imshow(面具)

通常情况下,我会用imclearborder删除图像顶部的大白色区域,然后,使用regionprops,确定每个连接blob的面积。的文档regionprops展示了如何使用这些信息轻松地消除结果图像中除了最大的对象之外的所有对象。(那大概只剩下斑马了。)但在这种情况下,这也会消除斑马腿周围所有孤立的小区域,我想保留这些区域。所以,我要快速包围斑马用imfreehand,并使用得到的蒙版消除所有外围斑点。

manualMask = imfreehand;

posns = getPosition (manualMask);[m, n, ~] =大小(面具);includeMask = poly2mask (posns (: 1), posns (:, 2), m, n);mask = mask & includeMask;掩码= imdilate(面具,strel (“磁盘”2));%这里轻微的调整imshow(面具);

现在使用分段斑马

是的!我喜欢那个面具,用它可以做很多事。方便,功能roifilt2允许我只对图像的遮蔽部分进行操作。不过,该功能只适用于2d图像,而不适用于RGB图像。但是,当这样做有意义时,我可以分别修改红色、绿色和蓝色平面,并使用重构RGB图像.例如:

processImage{1} = @(x) imadjust(x,[0.05;0.16], [1.00;0.11, 1.20);%红色飞机processImage{2} = @(x) imadjust(x,[0.10;0.83], [0.00;1.00, 1.00);%绿色飞机processImage{3} = @(x) imadjust(x,[0.00;0.22], [1.00;0.00, 1.10);%蓝色的飞机r = roifilt2 (img(:,: 1),面具,processImage {1});g = roifilt2 (img(:,: 2),面具,processImage {2});b = roifilt2 (img(:,:, 3),面具,processImage {3});enhancedImg =猫(r, g, b);图中,imshow (enhancedImg)

在粉彩领域创造“正常的”斑马是一个因为我不能做一个平面的去相关拉伸。所以,我要创建“粉彩效果”使用decorrstretch,然后重置值在戴面具的斑马下面回到他们最初的价值。

imgEnhanced = decorrstretch (img);%对原始图像进行操作现在将红色平面重置为原始图像的掩码值r = imgEnhanced (:,: 1);得到增强的红色平面tmp = img (:,: 1);得到原来的红色飞机将面具下增强的红色替换为原来的红色:r(面具)= tmp(面具);%绿色也一样g = imgEnhanced (:: 2);tmp = img (:,:, 2);g(面具)= tmp(面具);%和蓝色b = imgEnhanced (:: 3);tmp = img (:,:, 3);b(面具)= tmp(面具);现在重建增强的图像imgEnhanced =猫(r, g, b);用不调调调来强化颜色。imgEnhanced = imadjust (imgEnhanced, 0.1;0.8], [0.00;1.00, 1.00);%, imshow (imgEnhanced);标题(“瞧!”)(这再现了这篇文章顶部的斑马!)

谢谢,一个关于图像分割的说明,一个挑战

如果你是“Steve on Image Processing”的老读者,那么你就会知道我在过去几周征用了Steve的博客来展示我使用MATLAB创建特殊图像效果的设想。我要感谢史蒂夫主持这个嘉宾系列节目;我一直很喜欢阅读史蒂夫的博客,我很高兴为它贡献自己的力量。

在这个嘉宾系列的过程中,我分享了我的gui用于调整图像强度和尝试不同的形态操作和结构元素。我之前提到过,分割通常是图像处理问题中最困难的部分。所以,本着即将到来的节日精神,我想在这里与大家分享另外一个GUI:SegmentTool为分割图像提供一个交互环境。它目前包括用于边缘检测、阈值分割、霍夫变换(使用区域和扩展的极小值和极大值)以及基于颜色的分割的选项卡。把它试驾,让我知道你的想法,或其他你想看到合并。

这篇文章结束了这个客座系列,但并没有穷尽使用MATLAB和图像处理工具箱处理图像的创造性方法。所以我想以一个挑战来结束我的演讲:

  • 什么效果创建与MATLAB ?*与我们分享你自己的酷的图像效果!向我们展示如何仅使用MATLAB(当然还有MathWorks工具箱)就可以创建很酷的图像效果。我将编目,并在MATLAB中央文件交换上分享有用的或有趣的方法,用图像创建特殊效果。

注意,我想要的不仅仅是修改过的图像;请包含代码(或者至少是伪代码,要有足够的细节,以便其他用户可以复制该效果)。我很乐意送一些礼物给任何人分享的效果,被列入特效画廊。把你的代码发送给我brett.shoelson@mathworks.com

matlab快乐!

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




发布与MATLAB®R2012b

|
  • 打印
  • 发送电子邮件

コメント

コメントを残すには,ここをクリックしてMathWorksアカウントにサインインするか新しいMathWorksアカウントを作成します。