matlab抠图数据,MATLAB抠图
http://blog.sina.com.cn/s/blog_5dd2e9270100xdcp.html
代码不能运行,不知道咋回事
poison matting matlab code
注:显示图像后,单击鼠标左键连出完全背景区域,双击左键结束;
图像改变后,再单击鼠标左键连出完全前景区域,双击左键结束。即可得到结果。
A=imread(‘ppmm2.bmp‘);
imshow(A);
hold on;
Threshold = 1;
UniBack=[0
0
255];
% choose background object, and B results into the Foreground Object and the
% Boundary Region
% choose the outer line of the boundary region. Single left click the mouse to specify vertice.Double left click or single right click to finish;
OuterBW = roipoly(A);
B(:,:,1) = immultiply(A(:,:,1),OuterBW);
B(:,:,2) = immultiply(A(:,:,2),OuterBW);
B(:,:,3) = immultiply(A(:,:,3),OuterBW);
Back(:,:,1) = immultiply(A(:,:,1),~OuterBW);
Back(:,:,2) = immultiply(A(:,:,2),~OuterBW);
Back(:,:,3) = immultiply(A(:,:,3),~OuterBW);
imshow(B);
% choose foreground object, and C results into a Circle of Interest
% choose the inner line of the boundary region. Single left click the mouse to specify vertice.Double left click or single right click to finish;
InnerBW = roipoly(B);
C(:,:,1) = immultiply(B(:,:,1),~InnerBW);
C(:,:,2) = immultiply(B(:,:,2),~InnerBW);
C(:,:,3) = immultiply(B(:,:,3),~InnerBW);
Fore(:,:,1) = immultiply(A(:,:,1),InnerBW);
Fore(:,:,2) = immultiply(A(:,:,2),InnerBW);
Fore(:,:,3) = immultiply(A(:,:,3),InnerBW);
imshow(C);
hold off;
RawAlpha = (double(OuterBW)+double(InnerBW))/2;
I = double(A);
% Method of "averaging" to get raw fore and background colors
for i = 1:size(RawAlpha,1)
for j = 1:size(RawAlpha,2)
RawFore(i,j,1)=0;
RawFore(i,j,2)=0;
RawFore(i,j,3)=0;
RawBack(i,j,1)=0;
RawBack(i,j,2)=0;
RawBack(i,j,3)=0;
if RawAlpha(i,j) == 1
RawFore(i,j,:)=Fore(i,j,:);
end;
if RawAlpha(i,j) == 0
RawBack(i,j,:)=Back(i,j,:);
end;
if RawAlpha(i,j) == 0.5
r=1;
while 1
TestFore = InnerBW(max(i-r,1):min(i+r,size(A,1)),max(j-r,1):min(j+r,size(A,2)));
if size(find(TestFore),1)
[i1, j1] = find(TestFore);
i2 = i1 + max(i-r,1) -1;
j2 = j1 + max(j-r,1) -1;
Rs = double(Fore(i2,j2,:));
Ds(:,1)=diag(Rs(:,:,1));
Ds(:,2)=diag(Rs(:,:,2));
Ds(:,3)=diag(Rs(:,:,3));
if size(Ds,1) == 1
RawFore(i,j,:) =Ds;
else
RawFore(i,j,:) = sum(Ds) / size(Ds,1);
end;
clear Ds;
break;
else
r=r+1;
end;
end;
r=1;
while 1
TestBack = ~OuterBW(max(i-r,1):min(i+r,size(A,1)),max(j-r,1):min(j+r,size(A,2)));
if size(find(TestBack),1)
[i1, j1] = find(TestBack);
i2 = i1 + max(i-r,1) -1;
j2 = j1 + max(j-r,1) -1;
Rs = double(Back(i2,j2,:));
Ds(:,1)=diag(Rs(:,:,1));
Ds(:,2)=diag(Rs(:,:,2));
Ds(:,3)=diag(Rs(:,:,3));
if size(Ds,1) == 1
RawBack(i,j,:) =Ds;
else
RawBack(i,j,:) = sum(Ds) / size(Ds,1);
end;
clear Ds;
break;
else
r=r+1;
end;
end;
end;
end;
end;
%此处没有用高斯滤波
Denorm = RawFore - RawBack;
%red channel
I1 = I(:,:,1);
Denorm1 = Denorm(:,:,1);
for i=1:size(Denorm1,1)
for j= 1: size(Denorm1,2)
if Denorm1(i,j)==0
Denorm1(i,j)=1;
end;
end;
end;
OldAlpha = RawAlpha;
NewAlpha = RawAlpha;
h1=0;
while 1
for i=1:size(OldAlpha,1)
for j=1:size(OldAlpha,2)
NewAlpha(i,j) = OldAlpha(i,j);
if RawAlpha(i,j) == 0.5
Roui = ((I1(i+1,j) + I1(i-1,j) - 2 * I1(i,j)) * Denorm1(i,j) - (I1(i+1,j) - I1(i,j)) * (Denorm1(i+1,j) - Denorm1(i,j)))/(Denorm1(i,j) * Denorm1(i,j));
Rouj = ((I1(i,j+1) + I1(i,j-1) - 2 * I1(i,j)) * Denorm1(i,j) - (I1(i,j+1) - I1(i,j)) * (Denorm1(i,j+1) - Denorm1(i,j)))/(Denorm1(i,j) * Denorm1(i,j));
Rou = Roui + Rouj;
NewAlpha(i,j) = (OldAlpha(i+1,j) + NewAlpha(i-1,j) + OldAlpha(i,j+1) + NewAlpha(i,j-1) - Rou) / 4;
if NewAlpha(i,j)<0
NewAlpha(i,j)=0;
end;
if NewAlpha(i,j)>1
NewAlpha(i,j)=1;
end;
end;
end;
end;
% imshow(uint8(NewAlpha*255));
DifferenceAlpha = abs(NewAlpha - OldAlpha);
OldAlpha = NewAlpha;
if sum(sum(DifferenceAlpha)) < Threshold
break;
end;
h1=h1+1;
end;
for i=1:size(A,1)
for j=1:size(A,2)
if OldAlpha(i,j)==0
NewImage(i,j,:)=UniBack‘;
else
NewImage(i,j,1)=UniBack(1)*(1-OldAlpha(i,j))+RawFore(i,j,1)*OldAlpha(i,j);
NewImage(i,j,2)=UniBack(2)*(1-OldAlpha(i,j))+RawFore(i,j,2)*OldAlpha(i,j);
NewImage(i,j,3)=UniBack(3)*(1-OldAlpha(i,j))+RawFore(i,j,3)*OldAlpha(i,j);
end;
end;
end;
figure,imshow(NewAlpha);
figure,imshow(uint8(NewImage));
figure,imshow(uint8(RawFore));
figure,imshow(uint8(RawBack));
原文:http://www.cnblogs.com/natalie/p/5631548.html
matlab抠图数据,MATLAB抠图相关推荐
- matlab 自动处理数据,Matlab Remote IPC自动化数据处理
Matlab Remote IPC 实现数据自动化处理 转载请注明作者梦里茶 需求 在研究中遇到这样一种需求, 在Matlab端做GPU运算: 在Python端做数据清洗和数据分析: 两端分属两个服务 ...
- matlab 改变数据,MATLAb怎么实现对表格数据的修改
MATLAb怎么实现对表格数据的修改 关注:176 答案:2 mip版 解决时间 2021-01-11 09:07 提问者阳光在浪尖跳动 2021-01-10 09:50 MATLAb怎么实现对表 ...
- matlab光谱数据,matlab生成光谱仿真数据
生成光谱仿真数据 % 模拟单狭缝到双狭缝到四狭缝 % % % ... ... ... % ... .. ... ... ... % .......... ... .. ... ... % ... .. ...
- matlab合并数据,matlab使用小技巧——数据的拆分与合并
一.建立子文件夹-mkdir的使用 需求:在文件夹'截取后数据'中建立子文件夹s01-s32. 代码: for k=1:32 if k<10 pathname=sprintf('s0%d\\', ...
- matlab标量数据,matlab获取标量
1.mxIsDouble 功能:判断阵列是否是双精度类型 语法: #include"mex.h" bool mxIsDoule(const mxArray *array_ptr) ...
- 在Python中读取MATLAB的数据文件
简 介: 本文测试了几种通过python直接读取MATLAB的**.MAT格式的数据文件,有些方法经过测试发现无法完成.而通过mat4py可以比较方便的读取MATLAB中的数据文件.利用手边已有的用于 ...
- 【 MATLAB 】使用 MATLAB 得到高密度谱(补零得到DFT)和高分辨率谱(获得更多的数据得到DFT)的方式对比(附MATLAB脚本)
上篇博文分析了同一有限长序列在不同的N下的DFT之间的不同: MATLAB ]使用 MATLAB 作图讨论有限长序列的 N 点 DFT(强烈推荐)(含MATLAB脚本) 那篇博文中,我们通过补零的方式 ...
- python变量存为matlab,详解如何在python中读写和存储matlab的数据文件(*.mat)
背景 在做deeplearning过程中,使用caffe的框架,一般使用matlab来处理图片(matlab处理图片相对简单,高效),用python来生成需要的lmdb文件以及做test产生结果.所以 ...
- matlab保存数据
matlab保存数据 标签: matlab工作正则表达式浏览器扩展file 2012-06-11 11:28 26196人阅读 评论(2) 收藏 举报 本文章已收录于: 分类: matlab(3) 作 ...
最新文章
- Python基本数据类型之元组
- 每日一皮:为这位姑娘的回答鼓掌!
- python处理excel字典-使用Python代码处理Excel
- BZOJ-2716-天使玩偶angel-CDQ分治
- Eclipse 默认设置的换行长度
- 【Pytorch 】nn.functional.unfold()==>卷积操作中的提取kernel filter对应的滑动窗口
- Python递归法计算棋盘上所有路径总奖品最大值(京东2016编程题)
- 电脑屏幕卡住了按什么都没反应_刚买2个月,联想电脑屏幕出现坏点,售后回复:坏点不够3个不能保修...
- log4j日志配置方法
- 产品属性对风险定价有什么影响?
- itunes备份包括哪些内容_建筑工程的招标包括哪些内容?
- 怎么通过controller层退出登录_控制层访问拦截
- 64位Python读取周立功USBCAN-I信息
- .NET Remoting 配置文件方式
- 使用 OpenSSL 生成 HTTPS 证书
- java类加载器说法正确的_Java中的类加载器
- 生成树协议(一)STP协议原理简介:广播风暴、MAC地址表震荡实验、STP工作原理、BPDU简介、STP故障处理
- 2019icpc南京网络赛 Holy Grail(SPFA)
- KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机
- 一行代码搞定Android弧形卫星动画菜单(附Demo)