MATLAB可视化手动抠图

第一步:手动选点

第二步:生成蒙板

第三步:提取目标

最后

补充

by HPC_ZY

在做图像处理的时,常常需要对目标(感兴趣区域)进行分割,有时需要人工提取目标(抠图)。通过提供坐标范围进行提取,不够直观且难以一次成功。所以实现了一个简易的、可视化的、手动取点的抠图代码,分享给大家。

效果图如下:

第一步:手动选点

核心函数: [x, y, button] = ginput(N),用于获取鼠标所在坐标。其中,

x,y为鼠标坐标;

button为键位,返回值为1(左键),2(滚轮),3(右键);

N为记录点击的次数。

准备工作

显示图像,并初始化数组。

[M,N,D]=size(im);

figure

imshow(im)

k=0;

p=[];

手动选点

由于选取点数不确定,不能预设N值。所以通过数据按键来判断是否继续。

hold on

while 1

[x,y,flag]=ginput(1);

if flag==1

k=k+1;

p(k,1:2)=round([y,x]); % 交换,取整保存

plot(x,y,'b.','MarkerSize',20) % 标记

else

break

end

end

hold off

为了使当前选取范围更直观,可连接各选取点。修改后如下:

hold on

while 1

[x,y,flag]=ginput(1);

if flag==1

k=k+1;

p(k,1:2)=round([y,x]); % 交换,取整保存

plot(x,y,'b.','MarkerSize',20) % 标记

if k>1

line([p(k-1,2),p(k,2)],[p(k-1,1),p(k,1)],'LineWidth',2)

end

else

line([p(1,2),p(k,2)],[p(1,1),p(k,1)],'LineWidth',2)

break

end

end

hold off

注意:由于图像像素坐标索引与xy坐标系相反,所以要交换位置。

第二步:生成蒙板

主要方法:按序连接所有点形成封闭图形,并进行填充生成蒙板。

编写脚本函数,实现连线功能

核心原理:根据公式y-y0=k(x-x0),可计算线段表达式,从而通过取整确定线段覆盖的像素位置。详细计算过程不再赘述,实现如下:

% 其中 p0,p1为两个点的坐标,a为蒙板

function a=pixelcontect(a,p0,p1)

a(p0(1),p0(2))=1;

a(p1(1),p1(2))=1;

dis=p1-p0;

gap=((-1).^double(dis<0));

absdis=abs(dis);

more=max(absdis);

less=min(absdis);

if absdis(1)>=absdis(2)

dir1=[gap(1),0];

dir2=[0,gap(2)];

else

dir2=[gap(1),0];

dir1=[0,gap(2)];

end

lmp=less/more;

i=0;j=0;

while i

p0=p0+dir1;

a(p0(1),p0(2))=1;

i=i+1;

if i

p1=p1-dir1;

a(p1(1),p1(2))=1;

i=i+1;

end

if j/i

if j

p0=p0+dir2;

a(p0(1),p0(2))=1;

j=j+1;

end

if j

p1=p1-dir2;

a(p1(1),p1(2))=1;

j=j+1;

end

end

end

end % 函数结束

循环调用,完成全点连接

初始化蒙板,循环调用标记区域轮廓。

mask=zeros(M,N);

for i=1:k

if i

mask=pixelcontect(mask,p(i,:),p(i+1,:)); % 依次连接所有点

else

mask=pixelcontect(mask,p(i,:),p(1,:)); % 末尾与起点相连

end

end

填充模板

mask=imfill(mask,'hole');

第三步:提取目标

out=mask.*im;

注意:此处默认图像为double类型,可根据自己实际类型调整上述代码,否则报错-矩阵类型不一致。

若处理彩色图像,可加入以下代码

if D>1

mask=cat(3,mask,mask,mask);

end

最后

我们可以获得

1 p —— 标记点的坐标

2 mask —— 蒙板

3 out —— 目标图像

最后附上完整代码(简易版)

%% 主函数

function [out,mask,p]=manseg(im)

% 准备工作

[M,N,D]=size(im);

figure

imshow(im)

k=0;

p=[];

% 手动选点

hold on

while 1

[x,y,flag]=ginput(1);

if flag==1

k=k+1;

plot(x,y,'b.','MarkerSize',20)

p(k,1:2)=round([y,x]);

if k>1

line([p(k-1,2),p(k,2)],[p(k-1,1),p(k,1)],'LineWidth',2)

end

else

line([p(1,2),p(k,2)],[p(1,1),p(k,1)],'LineWidth',2)

break

end

end

hold off

% 生成蒙板

mask=zeros(M,N);

for i=1:k

if i

mask=pixelcontect(mask,p(i,:),p(i+1,:));

else

mask=pixelcontect(mask,p(i,:),p(1,:));

end

end

mask=imfill(mask,'hole');

if D>1

mask=cat(3,mask,mask,mask);

end

% 提取目标

out=mask.*im; % 注意:由于mask类型是double,所以用户输入的im也改成double,否则报错类型不匹配。

end

%% 子函数

function a=pixelcontect(a,p0,p1)

% ---------详见上文

end

补充

很多选手提出第44行代码报错的问题,调用的时候进行如下操作即可

im = double(im); % 假设im是你要处理的图片,且类型为uint8

[out,mask,p]=manseg(im);

out = uint8(out); % 转回uint8

因为我在处理图像之前喜欢归一化(im2double()),所以就不存在这些问题.

由于不少网友在使用中遇到问题,现将测试代码上传

https://download.csdn.net/download/xsz591541060/11151459

matlab手动抠图,MATLAB可视化手动抠图相关推荐

  1. MATLAB可视化手动抠图

    MATLAB可视化手动抠图 第一步:手动选点 第二步:生成蒙板 第三步:提取目标 最后 补充 其他 by HPC_ZY 在做图像处理的时,常常需要对目标(感兴趣区域)进行分割,有时需要人工提取目标(抠 ...

  2. matlab频域滤波处理,手动滤波,图像去网格背景:频域中手动选择目标区域进行滤波,滤掉噪声,灵活地达到理想的效果。

    目录 一.原理简介 二.现有方法 三.代码实现 四.测试结果图 一.原理简介 主要思路为:通过傅里叶变换,将图像显示在频率域中,通过观察频谱图,如果了解频谱图与原图之间的关联,可以较为容易地发现噪声在 ...

  3. matlab按图像边缘抠图_不会抠图?保姆级抠图教程!手把手教你抠图(一)

    本篇教程由浅入深的了解ps当中的每一个抠图工具以及原理,帮助大家提升工作效率的同时,还能打破很多同学对抠图的一些刻板印象. 抠图是我们几乎每一天都能接触到的工作,说到最好用的抠图工具,有的同学觉得是魔 ...

  4. MATLAB-基于长短期记忆网络(LSTM)的SP500的股票价格预测 股价预测 matlab实战 数据分析 数据可视化 时序数据预测 变种RNN 股票预测

    MATLAB-基于长短期记忆网络(LSTM)的SP500的股票价格预测 股价预测 matlab实战 数据分析 数据可视化 时序数据预测 变种RNN 股票预测 摘要 近些年,随着计算机技术的不断发展,神 ...

  5. matlab画波动图像,【基于Matlab的波动方程的可视化实现最终版材料】

    基于Matlab的波动方程的可视化实现(最终版) <基于Matlab的波动方程的可视化实现.doc>由会员分享,可免费在线阅读全文,更多与<基于Matlab的波动方程的可视化实现(最 ...

  6. matlab三维可视化,MATLAB中三维数据可视化及应用

    Value Engineering -----------------------作者简介:张晓利(1976-),女,陕西临潼人,硕士研究生,讲师,研究方向为 计算机应用. 0引言 MATLAB 在数 ...

  7. Mathematica+Matlab联合使用实现可视化、交互编程

    Mathematica的笔记本功能可以保存计算结果,而Matlab是基于代码运算以取得计算结果,或者可以说属于批处理模式:结合二者的优点,则可以实现笔记本功能的交互式.可视化Matlab程序开发.此外 ...

  8. matlab传热分析,基于matlab的超临界流体对流传热可视化分析方法

    基于matlab的超临界流体对流传热可视化分析方法 [技术领域] [0001]本发明涉及一种基于MATLAB的管内超临界流体对流传热可视化分析方法,属于MATLAB应用技术领域. [背景技术] [00 ...

  9. 一种从Robotstudio环境中导出机器人模型并在MATLAB下使其可视化的研究记录

    1.前记:回到学校反而没时间记录了自己瞎折腾的东西了,允我长长的叹一口气   '_' // 先提一下,在这篇MATLAB机器人可视化博客中提到了如何使CAD模型的机器人在MATLAB环境下可视化的问题 ...

  10. matlab 避雷针保护范围程序,基于MATLAB避雷针保护范围可视化设计与分析.doc

    基于MATLAB避雷针保护范围可视化设计与分析 基于MATLAB避雷针保护范围可视化设计与分析 摘要: 利用MATLAB设计避雷针保护范围可视化程序与界面,对避雷针保护范围采用折线法和滚球法进行对比分 ...

最新文章

  1. System.Transactions介绍
  2. JVM 在遇到OOM(OutOfMemoryError)时生成Dump文件的三种方式
  3. 断电后supervisor启动时报错
  4. jsp用户登录验证_Java之使用过滤器进行登录验证
  5. python ls_linux 常用shell命令 ls
  6. python版本的适配器模式(对象)
  7. stm32f103不同系列之间的代码移植
  8. java毕业设计便利店库存管理Mybatis+系统+数据库+调试部署
  9. 2019亚马逊差评回复模板,老手惯用的亚马逊差评应对技巧
  10. P2P流量检测8个方向
  11. 代码随想录第十一天 LeetCode 20、1047、150(栈)
  12. 中国首届DFMA降本设计峰会
  13. JAVA有percentile函数吗_五分位算法
  14. 海量数据去重之SimHash算法简介和应用
  15. IC基础知识(八)ROM、PROM、EPROM、EEPROM和Flash之间的区别
  16. Windows环境下msysgit安装git flow
  17. NVMe协议详解(一)
  18. 二级管、半波整流、全波整流、桥式整流、全桥
  19. Android可移动的悬浮窗
  20. Catlike Coding Unity教程系列 中文翻译 Basics篇(二)Building a Graph

热门文章

  1. 张宇高数 第二讲 一元函数微分学(思维导图)
  2. PageHelper.startPage 分页的坑
  3. python投资_python计算投资
  4. 高帝制礼作乐,周昌谏废太子
  5. 创翼linux版本,创翼电信客户端for Mac-创翼客户端Mac版下载 V1.3.7-PC6苹果网
  6. c语言编写时钟图案,用C语言绘制电子时钟图案
  7. 社区电商平台有哪些运营模式
  8. python给一列数据增加前缀_为Datafram的特定列添加前缀
  9. 【R语言 南丁格尔玫瑰图绘制】
  10. 探究光线追踪技术及UE4的实现