% 此代码用于测试 manseg()
% 20190429
% by HPC_ZY
clear;close all;clc
% 为避免计算中的一些问题,常常对图像进行归一化
im = im2double(imread('test.jpeg'));
% 测试
[out,mask,p]=manseg(im);
subplot(131),imshow(im)
subplot(132),imshow(mask)
subplot(133),imshow(out)
%% 主函数
function [out,mask,p]=manseg(im)
% im 为黑白或彩色图,格式为 double类型
% out 为原图截图
% mask 为截图蒙板
% p 为蒙板定点坐标
[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<k
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;
end
%% 子函数
% 其中 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<more
p0=p0+dir1;
a(p0(1),p0(2))=1;
i=i+1;
if i<more
p1=p1-dir1;
a(p1(1),p1(2))=1;
i=i+1;
end
if j/i<lmp
if j<less
p0=p0+dir2;
a(p0(1),p0(2))=1;
j=j+1;
end
if j<less
p1=p1-dir2;
a(p1(1),p1(2))=1;
j=j+1;
end
end
end
end % 函数结束
没有合适的资源?快使用搜索试试~ 我知道了~
(代码)MATLAB可视化手动抠图
共2个文件
m:1个
jpeg:1个
需积分: 5 107 下载量 117 浏览量
2019-04-29
15:37:59
上传
评论 8
收藏 22KB RAR 举报
温馨提示
之前写了一篇《(来点有用的)MATLAB可视化手动抠图 》,很多网友回复说在使用中出现问题。 经复查原始代码没有问题,或是使用不当造成,现将测试代码上传,供使用。谢谢交流
资源推荐
资源详情
资源评论
收起资源包目录
MATLAB可视化手动抠图 .rar (2个子文件)
test.jpeg 21KB
test.m 2KB
共 2 条
- 1
资源评论
今天不飞了
- 粉丝: 2345
- 资源: 17
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功