改变眼睛图像中特定区域的颜色[Matlab]

2024-04-20

I am trying to change the pupil of the following image:
enter image description here
This is not a feature extraction or eye detection task. I want to "manually" change the color of the pupil.

我试图做的是找到瞳孔颜色值并将其更改为红色或紫色,例如:

I2是加载的图像:

I3=(I2<100);
figure(5)
imagesc(I3) 
colormap purple


我已经在论坛中搜索过,但没有看到任何合适的解决方案
有什么建议么?


不幸的是,您别无选择,只能检测瞳孔所在的位置并用您想要的颜色填充这些像素。简单的阈值处理是行不通的,因为睫毛的强度分布与瞳孔大致相同。

我们能做的就是做一些后期处理after您对图像设置阈值。然而,我建议需要 MATLAB 中的图像处理工具箱。如果您没有这个,那么不幸的是我的解决方案将不起作用。

假设您确实可以访问此内容,我可以建议使用regionprops http://www.mathworks.com/help/images/ref/regionprops.html检测图像中的独特形状。这是假设您正确地对图像进行阈值设置。我要专门看看'Area' and 'PixelList'属性。一旦我们对图像进行阈值处理,我们应该预期主要有两个聚集像素区域:睫毛和瞳孔。睫毛的面积可能最大,而瞳孔的面积第二大。因此,让我们看一下Area属性并确定图像中面积第二大的对象。一旦我们找到这个对象,我们就会将该区域所在的这些像素设置为您想要的任何颜色。但是,我们必须进行一些后期处理,以确保整个瞳孔被填充。您会看到瞳孔中间有一个白点,很可能是由于相机的闪光灯造成的。我们本质上需要确保整个检测到的瞳孔是一个闭合轮廓,然后填充该形状。一旦我们填充了这个形状,我们只需使用这些像素并将它们设置为您希望在输出图像中出现的任何颜色。


现在,第一步是正确设置图像阈值。首先,我直接从 StackOverflow 读取图像。但是,该图像是 RGB 图像,我想要等效的灰度图像。我们可以用rgb2gray http://www.mathworks.com/help/matlab/ref/rgb2gray.html为我们实现这一目标。完成后,我使用强度阈值 35,然后运行regionprops像这样:

im = imread('https://i.stack.imgur.com/d3hy5.jpg');
im = rgb2gray(im);
s = regionprops(im < 35, 'Area', 'PixelList');

s将包含信息结构,其中每个元素告诉您属于图像中检测到的每个唯一对象的区域和像素。我们来看看该地区:

areas = [s.Area].'

areas =

       1
       2
       1
       2
       5
       3
       1
      19
       3
       1
       2
       2
       1
      23
    1224
       1
       2
      41
      12
       2
       1
       2
       1
       5
       2
      33
     480
       3
       6
       1
       2
       1
       1
       2
       1

您可以看到,在我们阈值之后产生了很多虚假的孤立像素,这是有道理的。您还会看到,我们有几个补丁的面积比大多数补丁的面积要大得多。有一个斑块的面积为 1433,而另一个斑块的面积为 480。1433 的区域很可能是属于睫毛的像素,因为它们或多或少具有与瞳孔相同的强度分布。瞳孔将失去的可能是第二高的区域。因此,让我们看一下具有以下内容的补丁:第二高面积。要找出这是哪里,请使用find http://www.mathworks.com/help/matlab/ref/find.html:

ind = find(areas == 480);

现在我们知道它位于哪里s,让我们把这个拿出来PixelList属性。这将为您提供属于该对象的像素列表:

pix = s(ind).PixelList;

第一列表示属于对象的每个像素的列位置,而第二列表示行位置。接下来我要做的是获取这些像素并创建一个mask仅包含这些检测到的像素。我将使用这个蒙版来索引原始图像并将这些像素设置为您想要的任何颜色。像这样:

mask = logical(full(sparse(pix(:,2), pix(:,1), 1, size(im,1), size(im,2))));

代码使用sparse http://www.mathworks.com/help/matlab/ref/sparse.html创建一个稀疏矩阵,其中每个值都是 0except对于那些定义在中的像素位置pix。这是一种仅在指定位置创建 1 矩阵的更简单方法,否则创建 0 矩阵。因为这是sparse,我需要将其更改为full http://www.mathworks.com/help/matlab/ref/full.html我们可以使用的数字矩阵,最后我们需要使用logical以确保正确的面罩。

如果我们使用这个掩码来展示imshow,这就是我们得到的:

您可以看到,由于原始图像中瞳孔的白点而存在间隙,这是有道理的。您还会注意到瞳孔的轮廓并未完全闭合。因此,我将通过以下方式执行形态学关闭imclose http://www.mathworks.com/help/images/ref/imclose.html通过选择磁盘结构元素来弥补差距。一旦我们缩小了差距,我们就可以使用imfill http://www.mathworks.com/help/images/ref/imfill.html并选择'holes'标志来填补这些漏洞。

现在我们有了一个完全填充的蒙版,我们最终可以用它来索引原始图像并设置颜色。像这样:

mask = imclose(mask, strel('disk', 4, 4));
mask = imfill(mask, 'holes');

这是面具现在的样子:

凉爽的!现在您需要做的最后一件事就是用您想要的任何颜色为这些像素着色。为此,您需要制作图像的 RGB 版本。因此,只需创建红色、绿色和蓝色通道来复制图像的灰度内容,并使用蒙版中定义的像素为每个通道设置适当的颜色。

red = im;
red(mask) = 255;
green = im;
green(mask) = 0;
blue = im;
blue(mask) = 0;
out = cat(3, red, green, blue);
imshow(out);

请记住,对于灰度图像,RGB 等效值具有相同的所有红色、绿色和蓝色值。一旦我们设置了瞳孔的颜色,使用以下命令将所有这些堆叠在一起作为 3D 矩阵cat http://www.mathworks.com/help/matlab/ref/cat.html最后我们展示了图像。我还将瞳孔的颜色设置为红色。您可以通过更改常量分配将 RGB 值更改为您想要的任何值(255, 0, 0)成为您想要的颜色。

这就是我们得到的:


为了您复制和粘贴的乐趣,这是从开始到结束的完整代码:

im = imread('https://i.stack.imgur.com/d3hy5.jpg');
im = rgb2gray(im);
s = regionprops(im < 35, 'Area', 'PixelList');
areas = [s.Area].';
ind = find(areas == 480);
pix = s(ind).PixelList;
mask = logical(full(sparse(pix(:,2), pix(:,1), 1, size(im,1), size(im,2))));
mask = imclose(mask, strel('disk', 4, 4));
mask = imfill(mask, 'holes');
red = im;
red(mask) = 255;
green = im;
green(mask) = 0;
blue = im;
blue(mask) = 0;
out = cat(3, red, green, blue);
imshow(out);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

改变眼睛图像中特定区域的颜色[Matlab] 的相关文章

  • 有没有办法在 MATLAB 中执行函数内联?

    我可以使用什么语言功能或开箱即用的技巧来完成 MATLAB 中的函数内联 令人烦恼的是 Google 搜索 matlab 内联函数 http www google com search q matlab inline function揭示了
  • 正确重载 stringbuf 以替换 MATLAB mex 文件中的 cout

    MathWorks 目前不允许您使用cout当 MATLAB 桌面打开时 从 mex 文件中读取 因为它们已重定向 stdout 他们当前的解决方法是提供一个函数 mexPrintf 他们要求你改用 http www mathworks c
  • 如何在 R 中导入 matlab 表

    我有一个matlab mat文件与表数据类型我想将其导入 R 中 我为此使用 readMat R 正在将其作为列表读取 之后有没有办法将列表转换为 R 中的数据帧或表格格式 当我使用as dataframe我收到以下错误 Error in
  • 在 MATLAB 中高效地形成动态窗口

    有人可以帮助我提供一种有效的方法 或者帮助我执行提供的代码 以尽可能少的步骤获得相同的结果 我将感激你 我有一个原始数组 A 1 1 1 4 3 4 5 4 4 3 3 1 0 0 2 6 2 6 3 6 6 2 7 4 8 7 2 2 2
  • 增加图像亮度而不溢出

    我在尝试增加图像亮度时遇到问题 这是原始图像 我想要得到的图像是这样的 现在使用以下代码增加亮度 image cv2 imread home wni vbshare tmp a4 index2 png 0 if sum image 0 le
  • 将二进制文件转换为图像

    我需要找到一种将二进制文件转换为图像的快速方法 二进制文件由 N 个NN 矩阵 我想将 0 与一种颜色关联 将 1 与另一种颜色关联 我需要对超过 1000 个二进制文件执行此操作 如果可能的话 我想避免使用 MatLab 有没有任何工具
  • Matlab 中 interp2 的类似 OpenCV Api

    有没有类似的功能 其工作原理与 interp2 x y frame z xd yd linear 0 在 OpenCV 中 功能cv remap 几乎可以满足您的要求 请参阅文档here http docs opencv org modul
  • 使用 OpenCV 裁剪黑色边缘

    我认为这应该是一个很简单的问题 但我找不到解决方案或有效的关键字进行搜索 我只有这个图像 黑边没有用 所以我想把它们剪掉 只留下 Windows 图标 和蓝色背景 我不想计算Windows图标的坐标和大小 GIMP 和 Photoshop
  • 在 iPad 上使用 OpenCV 避免碰撞

    我正在开展一个项目 需要使用 OpenCV 实现碰撞避免 这是在 iOS 上完成的 iOS 5 及以上版本即可 项目目标 这个想法是将 iPad 安装在汽车仪表板上并启动应用程序 应用程序应该从相机中抓取帧并进行处理 以检测汽车是否会与任何
  • 在opencv中发现凸性缺陷? [根据给定的输入图像崩溃..]

    我有一个计算图像凸包的程序 我正在尝试使用此信息来计算fingers存在于输入图像中 从一些冲浪中我发现做到这一点的方法 数手指 是 寻找轮廓 凸包 凸性缺陷 但我在使用凸性缺陷函数时遇到了麻烦 它编译得很好 但在运行时程序会因某些输入图像
  • Matlab 的快速 JSON 解析器

    您知道 Matlab 中有一个非常快速的 JSON 解析器吗 目前我正在使用JSONlab http www mathworks com matlabcentral fileexchange 33381 jsonlab a toolbox
  • 图像处理编程

    我想知道是否有任何方法可以使用某种编程语言检测图像中对象的位置 例如 如果我有一个球的图像 每 100 毫秒更新一次 是否可以通过某些程序使用某些东西来获取球的坐标 看一下OpenCV http opencv willowgarage co
  • 如何使图像呈现出陈旧、布满灰尘、颜色褪色的外观?

    我有旧画的图像 这些画很旧 布满灰尘 颜色褪色 如图所示here https i stack imgur com xuoEF jpg 如何赋予任何图像这种 旧 外观 我找不到任何过滤器或 openCV 函数来实现这种类型的外观 EDIT 我
  • MATLAB 中的抗锯齿线和标记

    您好 我在 MATLAB 中有一张图像 我希望这条线是平滑的 看看从 0 4 到 0 8 的线 这太可怕了 当在图中使用 LineSmoothing on 运算符时 我得到了这个 我在线条上做得很好 但它也使标记变得平滑 而且它们太可怕了
  • 在 Android 应用程序中编辑/添加 IPTC 元数据

    我看过许多其他类似的问题 但似乎没有一个有准确的答案 我正在开发一个可处理大量图像的 Android 应用程序 我希望通过编辑 IPTC 关键字标签 或其他适当标签 的值来向图像添加信息 我在用元数据提取器 http drewnoakes
  • 查找数组中元素之间的平均差异的有效方法

    希望标题不会让人困惑 通过例子来展示很简单 我有一个像这样的行向量 1 5 6 我想找到每个元素之间的平均差异 此示例中的差异为 4 和 1 因此平均值为 2 5 这是一个小例子 我的行向量可能非常大 我是 MatLab 新手 那么有没有一
  • 在 MATLAB 中将数据拟合到 B 样条

    我正在尝试估计矩阵形式的时间序列数据中的缺失值 列代表时间点 即现在 我想将矩阵的每一行拟合到 B 样条曲线 并用它来估计缺失值 我可以使用 MATLAB 将数据拟合到普通样条曲线 但我完全陷入尝试找出如何拟合数据以创建 B 样条曲线的困境
  • 将单元格转换为双精度

    gt gt C 1 2 CF 2 C 1 2 CF 2 gt gt whos C Name Size Bytes Class Attributes C 2x2 478 cell 我怎样才能转换C into double以便 gt gt C
  • Matlab 编辑器不使用 emacs 快捷方式

    Is there some way I can make the matlab integrated editor not use emacs shortcut but use more normal shortcuts such that
  • 这是 `min` 和 `nanmin` 之间的区别; Matlab 中的“max”和“nanmax”?

    Matlab描述nanmin and nanmax像这样 NANMIN最小值 忽略NaNs NANMAX最大值 忽略NaNs 但实际上 min and max ignore NaNs too 那我应该使用哪个 根据我的测试 nanmin a

随机推荐

  • 列出包含重复的数字的所有唯一排列的算法

    问题是 给定一个可能包含重复项的数字集合 返回所有唯一的排列 最简单的方法是使用集合 在 C 中 来保存排列 这需要O n log n 时间 有更好的解决方案吗 最简单的方法如下 对列表进行排序 O n lg n 排序后的列表是第一个排列
  • WCF:如何跟踪消息正文?

    我正在尝试诊断在相对简单的服务主机进程 Service exe 中自托管的 WCF 服务 我已这样配置 Service exe config
  • 在 Swift 中“夹住”两个值之间的数字的标准方法

    Given let a 4 2 let b 1 3 let c 6 4 我想知道将这些值限制在给定范围内的最简单 最快捷的方法 例如0 5 这样 a gt 4 2 b gt 0 c gt 5 我知道我可以执行以下操作 let clamped
  • 无法检查 int 是否为 null

    我正在尝试使用字典 每当我想检查字典中是否存在某个元素时 我都会这样做 int value results get aKeyThatMayOrMayNotBePresent if value null 但编译器说我无法比较int to a
  • 更新命令行输出,即进度

    我希望能够在命令行上用简单的 PHP 脚本显示进度表 而不是看到 Progress 0 Progress 1 etc 我只想更改号码 并替换以前的号码 就像 git clone 所做的那样Resolving deltas 100 8522
  • 在 Django admin 中使用模型显示表

    我正在尝试创建一个项目管理类型的应用程序 现在我有了如图所示的项目模型 当我保存它时 我可以获得用户名和时间 现在 在下面的同一页面中 我想显示用户可以添加 编辑的表格 就像这张图片中一样 How can i do that 我们要创建数据
  • 在 WP7 Silverlight 应用程序中导航时将复杂对象传递到页面

    我一直在使用NavigationService s Navigate导航到我的 WP7 Silverlight 应用程序中其他页面的方法 NavigationService Navigate new Uri Somepage xaml va
  • 我可以在 AngularJS 中使用一个 ng-app 到另一个 ng-app 中吗

    我有两个 ng app 喜欢 div somexpression div some more expression div div 有什么办法让它发挥作用吗 当我制作嵌套 ng app 时它不起作用 我知道我可以使用两个不同的控制器 但我不
  • 更改django的默认静态目录

    我在 Django 1 6 中遇到了一个问题 我想更改 django 中的默认静态文件目录 我不想让它进来project myapp static but in project static 我阅读了 django 的文档 添加了 STAT
  • PHP 中避免代码注入的最佳方法

    我的网站最近遭到了攻击 在我看来 这是一个无辜的代码 那里没有 SQL 调用 所以我不担心 SQL 注入 但显然 SQL 并不是唯一的注入方式 这个网站有一个解释和一些避免代码注入的例子 http www theserverpages co
  • 无法让 netTcpBinding 请求显示在 Fiddler 中

    我有一个具有两个端点的 WCF 服务 一种使用 basicHttpBinding 另一种使用 netTcpBinding 这是我的配置
  • Ecto 模型 - select 中的子查询

    我需要使用 Ecto 进行 SQL 查询 SELECT users select count 0 from money transactions where from id users id AND created at gt 2016 1
  • Google Maps API v3:单击 DOM 元素时关闭信息窗口

    我是第一次使用 Google 地图 所以我在 CSS Tricks 上查看了一个很好的教程 http css tricks com google maps slider http css tricks com google maps sli
  • 您的 APP_BUILD_SCRIPT 指向未知文件:./jni/Android.mk

    我正在尝试让 ndk gdb 工作 但遇到一些问题 我的项目结构是这样的 trunk indiana Here is the android manifest ubravo java mbravo here is the native co
  • aws 从 lambda 调用步骤函数

    所以我设置了一个步骤函数来调用将发送电子邮件的兰巴 我已经手动测试了它并且它有效 现在我想最初使用新的 lambda 调用此步骤函数 我在网上找到了一些代码并且我已经玩过它 通过了测试并且不会引发任何错误 有谁知道我错过了什么 因为它不起作
  • plt.imshow() 和 plt.show() 没有图像弹出或显示

    我试图通过将 cocoapi 演示脚本复制粘贴到我自己的本地脚本中来重新创建它 而不是在 Jupyter 笔记本上运行它 一切工作正常 并且肯定有图像被读取并且可以显示 因为我已经使用 openCV 的 imshow 函数对其进行了测试 并
  • 更改 Mercurial“默认”父 URL

    假设我有一个 Mercurial 存储库 并且我从默认父 URL 我克隆它的源 中提取数据 现在我想更改默认的父 URL 主机名更改 或者将其复制到另一台计算机等 有没有办法做到这一点 或者我必须从新的 URL 重新克隆 您甚至可以在 hg
  • 由于 MultiReleaseException,jdeps 无法打印模块 deps

    我们有一个基于 JavaFX 的应用程序 它是not模块化 有原因 涉及遗留库 但我们使用构建自定义运行时jdeps and jlink 我们最近重写了该应用程序并添加了一些新的依赖项 并删除了其他依赖项 现在 正在构建应用程序的脚本突然停
  • EFCore 3.1 - 通过 Any 存在查询;查询无法翻译

    我们使用 EFCore 3 1 并尝试通过跨越 2 个属性的 Any 使用 Exists 构建查询 var selectionCriteria someHugeList Select sh gt new sh Id sh StatusCod
  • 改变眼睛图像中特定区域的颜色[Matlab]

    I am trying to change the pupil of the following image This is not a feature extraction or eye detection task I want to