精华内容
下载资源
问答
  • 方法一 蒙版提线第一步,在PS里面打开一张图片在PS里面复制一层图层接下来我们运用一下快捷键按Ctrl+A全选图层,按Ctrl+C复制一层图形,之后按Q键进入快速蒙版。进入快速蒙版以后,颜色条会变成只有很白跟灰度调节...

    29b025500177a2d070ffbbb3957f956d.png

    大家看到一些漂亮的作品的时候,想拿过来自己上色,却总是苦恼不知道该怎么抠出线稿,那么今天鳗鱼君给大家介绍一下怎样用PS去抠出线稿。

    方法一 蒙版提线

    第一步,在PS里面打开一张图片

    10d688f849eaadca0c4377cc4f6110a9.png
    在PS里面复制一层图层

    接下来我们运用一下快捷键

    按Ctrl+A全选图层,按Ctrl+C复制一层图形,之后按Q键进入快速蒙版。

    72e277b20f7ac0c2488ce0f4812fa994.png
    进入快速蒙版以后,颜色条会变成只有很白跟灰度的调节

    然后按Ctrl+V复制图层,按Q键退出快速蒙版

    fe43bb1a75e963c681c157e8697fac97.png
    这个时候线稿已经锁定出来了

    接下来按Delete删除键,再按Ctrl+D删除蚂蚁线。

    c07bf9b29297513d904d28c5d715aed9.png
    把背景图层隐藏掉就可以看到清晰的线稿了

    d5d613a864be07f62e0084b4cf19221e.png
    线稿不清晰可以按Ctrl+Shift+U把明度调黑即可
    方法二 利用通道提取线稿

    首先打开PS,拖动一张图片到PS里面

    0d226b4bd3fb9ac5a3be2287845be8e1.png

    复制一层图层,并且将背景图层填充成白色。

    c285d8c8cbab157a37a28848ea925eb2.png

    选择通道按住Ctrl点击RGB图层

    35cfb7d7696c691425dc444bf3bfde86.png

    然后点击图层返回到图层界面,按Ctrl+D消除蚂蚁线。

    这样就可以提取出线稿出来了

    方法三 上色图片如何提取线稿

    我们还是在PS里面继续打开一张图片

    452c35dc0647ff54628ac569e525ea32.png

    按住Shift+Ctrl+U去色

    e4f7a6c3efcebc174f2fe2478ddf8869.png

    快捷键可以极大的加大我们在作图时候效率。

    按Ctrl+C再按Ctrl+V复制一层图形,然后我们在正常图层上面选择变为划分。

    7f30dd86769858a43eb170e514413c13.png

    529098378eab312d72c2f502df7a788c.png
    这个时候图层应该变成白色了

    2d40dcd26388b996d34046d3b8b9df9c.png

    选择——滤镜模糊——高斯模糊

    然后合并两张图层之后,我们就可以得到黑白的图形了。

    bf20a90515a222b7f0208f037239c8cb.png

    之后的方法就很简单了。还记的我们上面说过提取线稿的方法吗??照着做就好了,今天的教程就到这里啦~感谢大家的支持,喜欢的可以持续关注我们!

    展开全文
  • 下图是一张色谱条带我们需要将其做成下面的图形放在论文中,该怎么弄呢,赶紧来学学的吧!软件FIJI 或ImageJ软件,Origin2019b软件图文教程数据提取1. 使用FIJI打开图片(直接拖拽进去即可),这里我使用的是原始图2. ...

    导言

    图像具有一定的灰度数值,利用这个属性我们可以将实验图片进行数值化,进而进行可视化,达到定性和定量的相结合,将其应用在论文中是一个不错的选择。

    下图是一张色谱条带

    75ae0c38d4b4f3ab6297c985268f6592.png

    我们需要将其做成下面的图形放在论文中,该怎么弄呢,赶紧来学学的吧!

    f738ed84d8517fba67323a9773d9e3ba.png

    软件

    FIJI 或ImageJ软件,Origin2019b软件

    图文教程

    数据提取

    1. 使用FIJI打开图片(直接拖拽进去即可),这里我使用的是原始图

    850d1194efb8752957b358a20d91e3e1.png

    2. 我们选择第一条条带进行演示,使用矩形工具进行框选择第一条条带,点击菜单栏-Image-Crop,进行裁剪

    333caebf12d2e5ee249b80a2e2c02e3a.png

    3. 点击左上角File-Save as另存为图片备用

    36204de6ed2002a0bda1ac222a586e1c.png

    4. 使用直线工具画一条直线在条带上,然后双击直线工具,可以将线条调整的粗一点

    6a76226e22ec1b948f958c70e94ca5e4.png

    5. 点击直线分析,Analyze-Plot Profile

    f0832de4e8518ba57adca5e1f626630a.png

    6. 在这里就会出现一张类似的色谱曲线图,其中左下角会有一些参数。点击List,就会出现图形的对应的数据,点击Data你可以将数据保存在csv格式的文件中,点击more你可以对横纵坐标进行设置。这里,我们将数据保存在csv文件中,以方便日后使用。

    03463d9a8b8f3b89b1f4dd4d992623f8.png
    c9527da386247921f51c6bfb9a3ed596.png

    软件作图

    1. 使用Origin进行作图,将上述数据复制进来,写好纵坐标,横坐标是像素值,我们就不显示了

    eab073df999fba67045f355bc8bd7da1.png

    2. 通过一系列基础设置就如下所示

    20e2b69c1a143483d02c10e59e9fae6e.png

    3. 进行导出图即可

    一键组图

    1. 使用AI/PS/Origin/PPT软件,进行组图,然后导出图片即可

    700bc91aa5bd4e709fe9b8081a44c147.png

    怎么样,今天的教程学会了吗?

    展开全文
  • 折腾了好久,还是没折腾出来,不过还是有点点进步,看看这么一张图片,我是怎么实现对6个莲子的提取的。   还是代码贴出来,分享给大家,也请大家给提点建议。   image=imread('E:\qw1.jpg'); %%%背景...

                 折腾了好久,还是没折腾出来,不过还是有点点进步,看看这么一张图片,我是怎么实现对6个莲子的提取的。

     

    还是把代码贴出来,分享给大家,也请大家给提点建议。

     

    image=imread('E:\qw1.jpg');
    
    %%%背景的质心
     indimage=rgb2ind(image,map);%将待处理图片转换为索引图像
    [height,width]=size(indimage);%计算灰度索引图像的长宽 
    backgroud1=zeros(height, width);%创建背景(全0)
    backgroud1=~backgroud1;%背景取反,目的是求质心
    bckg_zhixin=regionprops(backgroud1,'Centroid');%求背景的质心
    backgroud1=~backgroud1;%背景取反,恢复黑色。
    bckg_x=bckg_zhixin.Centroid(1);%背景质心X坐标
    bckg_y=bckg_zhixin.Centroid(2);%背景质心y坐标
    
    %%%处理图片,提取6个贝母的边缘
    [H,S,V]=rgb2hsv(image);%step1:获取图片HSV分量,分别代表色调,饱和度,亮度
    hMedian=median(median(H));%step2:提取中位数以下H分量,进行二值化
    hBw1=im2bw(H,hMedian);%step3:二值化,阈值为hMedian
    HBelowMedian=H.*(~hBw1);%step4:剩余H二值化
    hBw2=im2bw(HBelowMedian,graythresh(HBelowMedian));%二值化,阈值为graythresh(HBelowMedian)
    for i=1:size(image,1)
        bwImage(i,:)=bitxor(hBw1(i,:),hBw2(i,:));%%将hBw1和hBw2异或得到结果
    end
    bwImage=~bwImage;%图像取反
    [B0,L0] = bwboundaries(bwImage,'noholes');%边界跟踪,返回划分的区域L0,noholes算法只搜索目标的外边界。
    stats = regionprops(L0,'Area');%regionprops测量每个标签区域L0的属性
    [sortAfter,Index] = sort([stats(:,:).Area],'descend');%对数组进行降序排序,并返回排序后的数组,Index为返回的排序后元素在原数组中的行位置或列位置.
    
    
    %%%处理第一个贝母
    LL1 = ismember(L0,Index(1));%判断一个集合是否为另一个的子集,此地方是。
    bwImage1 = bwlabel(LL1);%进行标注
    bwImage1 = imfill(bwImage1,'holes');%%对二值图像中的目标孔进行填充点
    stats1=regionprops(bwImage1,'Centroid');
    x1=stats1.Centroid(1)% 求的图像1质心的坐标  
    y1=stats1.Centroid(2)% 求的图像1质心的坐标  
    indimage=rgb2ind(image,map);%将待处理图片转换为索引图像
    [height,width]=size(indimage);%计算灰度索引图像的长宽 
    for i=1:height   
            for j=1:width 
                if bwImage1(i,j)==0
                   indimage(i,j)=0; 
                end
            end
    end
     
    iimage1=ind2rgb(indimage,map);%将处理后的索引图像转换为真彩色图像
    
        if x1>=bckg_x
            image1move_x=x1-bckg_x;%贝母移动x坐标
        else
           image1move_x=bckg_x-x1;%贝母移动x坐标
        end
    
        if y1>=bckg_y
            image1move_y=y1-bckg_y;%贝母移动y坐标
        else
           image1move_y=bckg_y-y1;%贝母移动y坐标
        end
     
    for i=1:height   
            for j=1:width 
                if iimage1(i,j)~=0 
                    iimage1(fix(i-image1move_x),fix(j-image1move_y))=iimage1(i,j);          
                end
            end
    end
    
    
    rect=[bckg_x-80 bckg_y-80 bckg_x+80 bckg_y+80]; 
    showimage1=imcrop(iimage1,rect);% 用imcrop裁剪:
    figure;  
    imshow(showimage1);  
    imwrite(showimage1,'showimage1.bmp')
    title('1');
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    LL2 = ismember(L0,Index(2));%判断一个集合是否为另一个的子集,此地方是。
    bwImage2 = bwlabel(LL2);%进行标注
    bwImage2 = imfill(bwImage2,'holes');%%对二值图像中的目标孔进行填充点
    stats2=regionprops(bwImage2,'Centroid');
    x2=stats2.Centroid(1)% 求的图像2质心的坐标  
    y2=stats2.Centroid(2)% 求的图像2质心的坐标  
     indimage=rgb2ind(image,map);%将待处理图片转换为索引图像
    [height,width]=size(indimage);%计算灰度索引图像的长宽 
    for i=1:height   
            for j=1:width 
                if bwImage2(i,j)==0
                   indimage(i,j)=0; 
                end
            end
    end
    iimage2=ind2rgb(indimage,map);%将处理后的索引图像转换为真彩色图像
    % figure;
    % imshow(iimage2);
    % title('2');
    rect=[x2-80 y2-80 x2+80 y2+80]; 
    a2=imcrop(iimage2,rect);% 用imcrop裁剪:
    figure;  
    imshow(a2);  
    imwrite(a2,'a2.bmp')
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    LL3 = ismember(L0,Index(3));%判断一个集合是否为另一个的子集,此地方是。
    bwImage3 = bwlabel(LL3);%进行标注
    bwImage3 = imfill(bwImage3,'holes');%%对二值图像中的目标孔进行填充点
    stats3=regionprops(bwImage3,'Centroid');
    x3=stats3.Centroid(1)% 求的图像3质心的坐标  
    y3=stats3.Centroid(2)% 求的图像3质心的坐标  
     indimage=rgb2ind(image,map);%将待处理图片转换为索引图像
    [height,width]=size(indimage);%计算灰度索引图像的长宽 
    for i=1:height   
            for j=1:width 
                if bwImage3(i,j)==0
                   indimage(i,j)=0; 
                end
            end
    end
    iimage3=ind2rgb(indimage,map);%将处理后的索引图像转换为真彩色图像
    % figure;
    % imshow(iimage3);
    % title('3');
    rect=[x3-80 y3-80 x3+80 y3+80]; 
    a3=imcrop(iimage3,rect);% 用imcrop裁剪:
    figure;  
    imshow(a3);  
    imwrite(a3,'a3.bmp')
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    LL4 = ismember(L0,Index(4));%判断一个集合是否为另一个的子集,此地方是。
    bwImage4 = bwlabel(LL4);%进行标注
    bwImage4 = imfill(bwImage4,'holes');%%对二值图像中的目标孔进行填充点
    stats4=regionprops(bwImage4,'Centroid');
    x4=stats4.Centroid(1)% 求的图像4质心的坐标  
    y4=stats4.Centroid(2)% 求的图像4质心的坐标 
     indimage=rgb2ind(image,map);%将待处理图片转换为索引图像
    [height,width]=size(indimage);%计算灰度索引图像的长宽 
    for i=1:height   
            for j=1:width 
                if bwImage4(i,j)==0
                   indimage(i,j)=0; 
                end
            end
    end
    iimage4=ind2rgb(indimage,map);%将处理后的索引图像转换为真彩色图像
    % figure;
    % imshow(iimage4);
    % title('4');
    rect=[x4-80 y4-80 x4+80 y4+80]; 
    a4=imcrop(iimage4,rect);% 用imcrop裁剪:
    figure;  
    imshow(a4);  
    imwrite(a4,'a4.bmp')
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    LL5 = ismember(L0,Index(5));%判断一个集合是否为另一个的子集,此地方是。
    bwImage5 = bwlabel(LL5);%进行标注
    bwImage5 = imfill(bwImage5,'holes');%%对二值图像中的目标孔进行填充点
    stats5=regionprops(bwImage5,'Centroid');
    x5=stats5.Centroid(1)% 求的图像5质心的坐标  
    y5=stats5.Centroid(2)% 求的图像5质心的坐标 
     indimage=rgb2ind(image,map);%将待处理图片转换为索引图像
    [height,width]=size(indimage);%计算灰度索引图像的长宽 
    for i=1:height   
            for j=1:width 
                if bwImage5(i,j)==0
                   indimage(i,j)=0; 
                end
            end
    end
    iimage5=ind2rgb(indimage,map);%将处理后的索引图像转换为真彩色图像
    % figure;
    % imshow(iimage5);
    % title('5');
    rect=[x5-80 y5-80 x5+80 y5+80]; 
    a5=imcrop(iimage5,rect);% 用imcrop裁剪:
    figure;  
    imshow(a5);  
    imwrite(a5,'a5.bmp')
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    LL6 = ismember(L0,Index(6));%判断一个集合是否为另一个的子集,此地方是。
    bwImage6 = bwlabel(LL6);%进行标注
    bwImage6 = imfill(bwImage6,'holes');%%对二值图像中的目标孔进行填充点
    stats6=regionprops(bwImage6,'Centroid');
    x6=stats6.Centroid(1)% 求的图像6质心的坐标  
    y6=stats6.Centroid(2)% 求的图像6质心的坐标 
     indimage=rgb2ind(image,map);%将待处理图片转换为索引图像
    [height,width]=size(indimage);%计算灰度索引图像的长宽 
    for i=1:height   
            for j=1:width 
                if bwImage6(i,j)==0
                   indimage(i,j)=0; 
                end
            end
    end
    iimage6=ind2rgb(indimage,map);%将处理后的索引图像转换为真彩色图像
    % figure;
    % imshow(iimage6);
    % title('6');
    rect=[x6-50 y6-50 x6+50 y6+50]; 
    a6=imcrop(iimage6,rect);% 用imcrop裁剪:
    figure;  
    imshow(a6);  
    imwrite(a6,'a5.bmp')
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        
    
         


    最后运行情况也贴出来吧。

         

               做到现在这个情况,当然还没有实现想要的效果,但是基本的框架已经搭好了,现在的问题还有2个。1是平移,可以看见我们运行后的第一张图片,我是进行了平移处理的(即把莲子的质心移动到背景的中心点),也不知道哪里的原因,运行出来时那种情况。2是截取图像,我的想法是把平移好的莲子,通过imcorp函数实现,但是也存在一点点问题,老是截出来的图大小不一。请各位大虾帮帮忙啊。

    展开全文
  • GEE了利用霍夫变换提取几何图形 本文利用GEE提供Hough Transform函数探测线或圆等几何图形。先来看看霍夫变换是什么?... 假设有一幅图像,经过滤波,边缘检测等操作,怎么把这张图片直线提取出来...

    GEE了利用霍夫变换提取几何图形

    本文利用GEE提供的Hough Transform函数探测线或圆等几何图形。先来看看霍夫变换是什么?

    1、霍夫变换检测直线原理
    霍夫变换,英文名称Hough Transform,作用是用来检测图像中的直线或者圆等几何图形的。
    一条直线的表示方法有好多种,最常见的是 y=mx+b 的形式。 假设有一幅图像,经过滤波,边缘检测等操作,怎么把这张图片中的直线提取出来。基本的思考流程是:如果直线 y=mx+b 在图片中,那么图片中,必需有N多点在直线上(像素点代入表达式成立),只要有这条直线上的两个点,就能确定这条直线。该问题可以转换为:求解所有的(m,b)组合

    再来看看实例代码

    // 利用Landsat8影像,计算NDVI
    var image = ee.Image('LANDSAT/LC08/C01/T1_TOA/LC08_033032_20170719');
    var ndvi = image.normalizedDifference(['B5', 'B4']);
    // 先利用边缘检测出边界
    var canny = ee.Algorithms.CannyEdgeDetector({
      image: ndvi,
      threshold: 0.4
    }).multiply(255);
    
    // 对上述边缘检测利用霍夫变换提取直线
    //inputThreshold表示大于输入值像元被考虑;
    //lineThreshold我理解是线上大于100个点被探测为直线
    var h = ee.Algorithms.HoughTransform({
      image: canny,
      gridSize: 256,
      inputThreshold: 50,
      lineThreshold: 100
    });
    
    // 来进行图像显示
    Map.setCenter(-103.80140, 40.21729, 13);
    Map.addLayer(image, {bands: ['B4', 'B3', 'B2'], max: 0.3}, 'source_image');
    Map.addLayer(canny.updateMask(canny), {min: 0, max: 1, palette: 'blue'}, 'canny');
    Map.addLayer(h.updateMask(h), {min: 0, max: 1, palette: 'red'}, 'hough');
    

    来看看运行结果
    蓝色为边缘检测得到结果
    红色为霍夫变换检测结果,明显比边缘检测得到少
    在这里插入图片描述

    展开全文
  • 一般情况下,我都会把图片转换成word格式文档,这样就可以直接提取、使用其中文字啦。不过,现在很多常见office工具可能都没有“图片转word”这个功能,对此我们可以使用多功能pdf转换软件。平时,我就常用...
  • 假设有一幅图像,经过滤波,边缘检测等操作,那么接下来问题就是怎么把这张图片直线提取出来。基本思考流程是:如果直线 y=mx+b 在图片中,那么图片中,必需有N多点在直线上(像素点代入表达式成立),只要...
  • HelpLayer类,主要放了两个图形精灵上去,一个是游戏名字,一个是提示游戏怎么,就一张图: NumberLayer类,涉及到自定义字体制作,我们提取出来资源里,有很多数字图片: 现在我们要它们做成这...
  • 今天我们要讲三个类,这三个类应该算比較简单 HelpLayer类 ...NumberLayer类,涉及到自己定义字体制作,我们提取出来资源里,有非常多数字图片: 如今我们要它们做成这样...
  • 飞秋2013专业版

    2014-06-24 10:54:48
    您还可以点击输入框右上角的随手涂鸭按钮,绘制出您想要表达的图形,做到图文并茂。 二、聊天时如果给对方发送图片? 总共有四种方法:一是点击随手涂鸭按钮,进行绘图模式,绘制图形发给对方。二是点击发送图形...
  • 飞秋FeiQv2.4修正版

    2008-11-23 17:27:11
    您还可以点击输入框右上角的随手涂鸭按钮,绘制出您想要表达的图形,做到图文并茂。 二、聊天时如果给对方发送图片? 总共有四种方法:一是点击随手涂鸭按钮,进行绘图模式,绘制图形发给对方。二是点击发送图形...
  • asp.net知识库

    2015-06-18 08:45:45
    在C#里ArrayList转换为Array 或 Array转换为ArrayList C# 2.0 在.NET 2.0中,让你组件也可以绑定 .NET20 一种简单窗口控件UI状态控制方法 翻译MSDN文章 —— 泛型FAQ:最佳实践 Visual C# 3.0 新特性概览 C#...
  • oc的图形化os选择页面无用的理由也同上 因为你不用oc去引导windows并且直接省略选择页面,所以图形化的oc界面也就没用 一定要先改三码再用,具体的教程自己百度 icloud中的查找我的mac不要打开 安全与隐私中的...
  • 小编的确一直都想这方面命令做个总结,这次辛苦老范给我们整理了这份实用秘笈。  Bootcfg  bootcfg 命令启动配置和故障恢复(对于大多数计算机,即 boot.ini 文件)。  含有下列参数 bootcfg 命令仅在...
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    不同是,暴风影音将Media Player Classic改成了自己名字并加入了许多解码器,打包成自己产品,其实这也无可厚非,关键就在于其作者老爱里面捆绑一些我们用不到软件. TT--仿qq+p2p通讯(nat穿透) VC++遍历...
  • vc++ 应用源码包_2

    热门讨论 2012-09-15 14:27:40
    不同是,暴风影音将Media Player Classic改成了自己名字并加入了许多解码器,打包成自己产品,其实这也无可厚非,关键就在于其作者老爱里面捆绑一些我们用不到软件. TT--仿qq+p2p通讯(nat穿透) VC++遍历...
  • vc++ 应用源码包_6

    热门讨论 2012-09-15 14:59:46
    不同是,暴风影音将Media Player Classic改成了自己名字并加入了许多解码器,打包成自己产品,其实这也无可厚非,关键就在于其作者老爱里面捆绑一些我们用不到软件. TT--仿qq+p2p通讯(nat穿透) VC++遍历...
  • vc++ 应用源码包_5

    热门讨论 2012-09-15 14:45:16
    不同是,暴风影音将Media Player Classic改成了自己名字并加入了许多解码器,打包成自己产品,其实这也无可厚非,关键就在于其作者老爱里面捆绑一些我们用不到软件. TT--仿qq+p2p通讯(nat穿透) VC++遍历...
  • vc++ 应用源码包_4

    热门讨论 2012-09-15 14:38:35
    不同是,暴风影音将Media Player Classic改成了自己名字并加入了许多解码器,打包成自己产品,其实这也无可厚非,关键就在于其作者老爱里面捆绑一些我们用不到软件. TT--仿qq+p2p通讯(nat穿透) VC++遍历...
  • vc++ 应用源码包_3

    热门讨论 2012-09-15 14:33:15
    不同是,暴风影音将Media Player Classic改成了自己名字并加入了许多解码器,打包成自己产品,其实这也无可厚非,关键就在于其作者老爱里面捆绑一些我们用不到软件. TT--仿qq+p2p通讯(nat穿透) VC++遍历...
  • arcgis工具

    2012-10-22 22:37:31
    FILE/EXPORT MAP 然后选择相应的图片格式,此时也可设置答应分辨率 pdi 13. 建立注记层 方法一.carvert to Ananotation ,方法二.Draw工具条 方法三.从其他地方转换注记图层 14. 查看特定区域范围内某种地物...

空空如也

空空如也

1 2
收藏数 21
精华内容 8
关键字:

怎么把图片的图形提取