精华内容
下载资源
问答
  • 【高级教程】利用高级计算软件MATLAB抠图教程
    2021-04-18 11:28:10

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    A=imread('lin13.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));

    更多相关内容
  • matlab抠图换背景代码通过基于事件的触觉传感器在增强现实中启用触觉操作 抽象的 在现代世界中,需要努力将生产中的各种风险降至最低,并在机器人控制过程中简化操作员的工作。 然而,由于被操纵物体的触觉特性...
  • MATLAB抠图程序

    2015-12-21 14:54:28
    MATLAB抠图程序,非常实用,功能强大
  • MATLAB抠图

    2021-04-23 22:55:58
    http://blog.sina.com.cn/s/blog_5dd2e9270100xdcp.html代码不能运行,不知道咋回事poison matting matlab code注:显示图像后,单击鼠标左键连出完全背景区域,双击左键结束;图像改变后,再单击鼠标左键连出完全...

    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_抠图_锐化_边缘提取.zip
  • matlab批量抠图

    2017-02-13 22:10:58
    使用matlab编写的一个小程序,可以将图片批量扣图然后装换成png,适用于白色简单背景的图片
  • MATLAB抠图(示例代码)

    2021-04-18 10:05:03
    http://blog.sina.com.cn/s/blog_5dd2e9270100xdcp.html代码不能运行,不知道咋回事poison matting matlab code注:显示图像后,单击鼠标左键连出完全背景区域,双击左键结束;图像改变后,再单击鼠标左键连出完全...

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

    展开全文
  • matlab代码抠图野外时尚剪裁(服装剪裁系统) 概述 Clothes Cutout System是基于的Clothes Cutout System框架。 给定一个时尚图像及其,该软件将其中的潜在服装项目进行细分。 要求 入门 安装并编译。 运行演示脚本...
  • matlab实现手动抠图 m文件

    热门讨论 2011-10-26 11:00:34
    读取e盘下的pic文件 左键单击绘制轮廓 右键选择创建抠图 得到的抠图结果存在e盘下 matlab的m文件 程序很简单
  • MATLAB可视化手动抠图

    2021-04-24 23:04:41
    MATLAB可视化手动抠图第一步:手动选点第二步:生成蒙板第三步:提取目标最后补充by HPC_ZY在做图像处理的时,常常需要对目标(感兴趣区域)进行分割,有时需要人工提取目标(抠图)。通过提供坐标范围进行提取,不够...

    MATLAB可视化手动抠图

    第一步:手动选点

    第二步:生成蒙板

    第三步:提取目标

    最后

    补充

    by HPC_ZY

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

    效果图如下:

    612168b66f95440ddb31ebf1d02c0b40.png

    0346872fbdd8ef5975c0b8272a7aa436.png

    第一步:手动选点

    核心函数: [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-二值化抠图

    2021-11-03 10:00:19
    % 抠图 %{ 思想: 二值化前景图像,将标记为1的点的位置记录下来,相应的位置用前景替换背景 !注意示例所用图像为偏白色,所以要取反 %} clear all; clc; % 读文件 front=imread('frontground.jpeg'); back=...
  • NO.1 橡皮擦抠图说到橡皮擦大家肯定都用过啦,我们PS的橡皮擦功能跟大家平时用的橡皮擦功能是一样哦,想擦哪里擦哪里,然后把需要的部分留下就可以啦~NO.2 魔棒抠图魔棒工具应该是小白最喜欢的一个抠图...
  • 在PS的使用中,抠图是大家经常要用到的一个技能,很多新手都对PS抠图一知半解,其实PS的抠图方法有很多种,需要根据图像的特征来选择用哪一种,有时候更是需要用多种工具结合起来使用,这里给大家分享一下常用的简单...
  • 基于matlab抠图代码基于学习的抠图 Zheng、Yuanjie 和 Chandra Kambhamettu 的 Python 实现。 “基于学习的数字抠图。” 计算机视觉,2009 IEEE 第 12 届国际会议。 IEEE,2009 年。 要求 python 3.5+(虽然它应该...
  • 保姆级抠图教程!手把手教你抠图(一)​zhuanlan.zhihu.com上期我们说到了如何分析图像这期我们来了解工具工欲善其事必先利其器,我们来看下抠图的工具是怎样操作的。(文末福利)一、基本选择工具基本选择工具里...
  • 喜行与摄公号旅行丨摄影丨美图关注抠图是Photoshop操作最基本的技能,看似简单,但不同的图像用不同的方法或许会达到事半功倍的效果。小编今天推送的教程列举了PS抠图的九个绝招,掌握之后足以应对大部分抠图工作了...
  • 如果你能够成功的将系数矩阵A表示出来,并将源图像g的拉普拉斯滤波结果算出,那么求解上述问题就变成了求解线性最小二乘问题了 如果你使用的是Matlab,一般来说只需要用: f = A b 即可得到结果。 而如果你用的是...
  • 熟悉MATLAB软件的使用。2.掌握图像锐化的原理及数学运算。3.于MATLAB环境下编程实现对图片锐化。三、实验内容 利用图像基于单方向梯度算子,Robert算子,Sobel算 子,Pritt算 子, Laplacian算子,多方向模板,LoG...
  • 该代码基于色彩的阈值分割法,能将绿幕蓝幕图像进行抠图
  • 之前写了一篇《(来点有用的)MATLAB可视化手动抠图 》,很多网友回复说在使用中出现问题。 经复查原始代码没有问题,或是使用不当造成,现将测试代码上传,供使用。谢谢交流
  • matlab中的掩膜抠图

    万次阅读 热门讨论 2019-04-10 21:35:56
    matlab的掩膜操作实现扣图 需要原图以及mask im=imread([origin image path]) segM=imread([mask path]) s_img=size(im); %%change the interested area to 1 for i=1:s_img(1) for j=1:s_img(2) if segM...
  • BayesianMatting/code/app.figBayesianMatting/code/app.mBayesianMatting/code/bayesmat.asvBayesianMatting/code/bayesmat.mBayesianMatting/code/cluster_OrachardBouman.asvBayesianMatting/code/cluster_Oracha...
  • 绿幕抠图课设,实现了绿幕影视剧的视频中,依次对视频中的每一帧图像进行处理,可实现实时绿幕视频抠图。要求分别实现静态背景图像和动态背景图像下的绿幕视频抠图。并且该课设带有gui界面,可以进行交互操作
  • 泊松抠图matlab代码泊松曲面重建 Python 绑定 泊松曲面重建 v6.13 Python Binding of Poisson Reconstruction by [Michael Kazhdan] () for C++ GNU Compilation based on the MATLAB MEX-File bindings by 安装 $ ...
  • matlab中借助鼠标光标在原图上选定要分割的多边形状,程序按照多边形分割出多边形内的图像

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,118
精华内容 447
关键字:

matlab抠图

matlab 订阅
友情链接: anr.rar