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));

  

时间: 2024-10-13 19:45:08

MATLAB抠图的相关文章

Poisson image editing算法实现的Matlab代码解析

之前我发了数篇系列博文来仔细研究Poisson Image Editing算法,每次重新审视和深入,仿佛都能有更为深刻的认识和很大的收获.这应该算是我这个系列的完结篇,会用用Matlab代码一点一点的演示,原文作者到底是如何设计和实现他那个强大且影响深远的算法的.希望你在看本文之前务必参考一下文章来了解算法原理,本文将主要讲解编程实现的问题,对于前面讲过的内容,我不会深究.但我个人总体的感觉是,现在图像处理算法对数学的要求是越来越高了,像泊松融合.泊松抠图这样的算法如果没有偏微分方程(本算法中涉

paper 116:自然图像抠图/视频抠像技术梳理(image matting, video matting)

1. Bayesian Matting, Chuang, CVPR 2001.http://grail.cs.washington.edu/projects/digital-matting/papers/cvpr2001.pdf  论文下载http://grail.cs.washington.edu/projects/digital-matting/image-matting/项目网址 2. GraphCut Segmentation System, Rother, 2004.http://pd

利用MATLAB进行曲线拟合

软件环境:MATLAB2013a 一.多项式拟合 多项式拟合是利用多项式最佳地拟合观测数据,使得在观测数据点处的误差平方和最小. 在MATLAB中,利用函数ployfit和ployval进行多项式拟合. 函数ployfit根据观测数据及用户指定的多项式阶数得到光滑曲线的多项式表示,polyfit的一般调用格式为:P = polyfit(x,y,n).其中x为自变量,y为因变量,n为多项式阶数. polyval的输入可以是标量或矩阵,调用格式为 pv = polyval(p,a) pv = pol

MATLAB检查指定路径中的子文件夹中的文件名中是否带有空格

测试文件夹为: clear;close all;clc; %% %程序实现的功能 %检查指定路径中的子文件夹中的文件名中是否带有空格,并去掉文件名中的空格 %% %程序中用到的之前不清楚的函数如下 %1)strfind(a,b):即找a中是否有b,如果a中有b,则输出b的位置序号.没有输出空数组 %2)isempty(a):判断数组是否为空 %3)strrep(a,b,c):就是把a中所有出现的b换为c %4)movefile(a,b):a移动为b,如C:\test1.jpg移动为C\test2

关于MATLAB处理大数据坐标文件2017620

暑假已至,接下来组内成员将会各回各家,各找各妈,这肯定是对本次大数据比赛是很不利的. 接下来我会把任务分配给组员,当然任务会比起初的时候轻一点,因为我认为本次比赛的目的并不是我要求组员做什么,而是我的组员要求自己做什么! 我们现在主要接触的两门语言: MATLAB语言在数据处理方面很牛,它的画图功能也是杠杠的,尤其是3D画图 Python语言是一门近几年很火的语言,学好它对自己肯定只有益处,它的出生很晚,但是短短十多年,它已经稳居计算机语言前三名.尤其是现在的大数据时代,它的代码不仅简单易懂,而

linux用命令行运行matlab的.mat文件

入m文件所在目录后,运行 $ matlab -nodesktop -nosplash -r matlabfile 只用文件名matlabfile,不能添加.m

对AM信号FFT的matlab仿真

普通调幅波AM的频谱,大信号包络检波频谱分析 u(t)=Ucm(1+macos ?t)cos ?ct ma称为调幅系数 它的频谱由载波,上下边频组成 , 包络检波中二极管截去负半周再用电容低通滤波,可以得到基带信号,那么,截去负半周后的AM信号必定包含基带信号的频谱.我们可以通过matlab来验证. %已知基带信号为1hz,载波为64hz,调制系数ma=0.3,采样频率1024hz,FFT变换区间N为2048 clear; fs=1024; f=1; %1hz基带信号 fc=64; %64hz载

Matlab中使用jython扩展功能

Matlab中面向对象能力并不强,通过使用jython引擎能够对其功能扩展. 1 编辑classpath.txt增加jython.jar 在matlab中输入 which classpath.txt 结果: /usr/local/MATLAB/R2013a/toolbox/local/classpath.txt 编辑该文件,加入 /home/your_user/jython2.5.3/jython.jar 2 又一次启动matlab 3 编写代码測试 import javax.script.In

简单快捷抠图

身为一个前端开发渣渣,简单的抠图还是需要会的.要不然什么都求着UI... 拿此图举例 1.首先用PS打开,双击解锁背景,右键复制图层 2.接下来都需要在复制的图层上面操作,点击图像-调整-色阶,调色阶的意思是让颜色深的越深,浅的越浅. 3.找到工具栏的魔棒工具,点击颜色深的部分,容差根据自己图片进行设置,勾选消除锯齿,对所有图层取样. 4.点击图层0,按del键. 5.选中副本,右键删除图层 6.点击确定之后就能看到效果了,Ctrl+d 取消选区. 这种方法可以用于很多图片上面.