图像处理 轮廓提取_python图像形态学轮廓处理&人脸边缘轮廓提取 - CSDN
精华内容
参与话题
  • Opencv处理图像--轮廓提取

    千次阅读 2018-08-08 15:48:36
    Opencv处理图像--轮廓提取 使用cvfindContours 对图像进行轮廓检测。 #include<iostream> #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> ...

    Opencv处理图像--轮廓提取

    使用cvfindContours 对图像进行轮廓检测。

    #include<iostream>
    #include<opencv2/core/core.hpp>
    #include<opencv2/highgui/highgui.hpp>
    int main()
    {
    	
    	IplImage* img = cvLoadImage("E:\\test.bmp",0); 
    	IplImage* imgColor = cvCreateImage(cvGetSize(img),8,3);
    	IplImage* contoursImage = cvCreateImage(cvSize(img->width,img->height),8,1);
    
    	cvNamedWindow("hui");
    	cvShowImage("hui",img);
    	cvThreshold(img,img,100,255,CV_THRESH_BINARY); //二值化图像以100为阀值
    	cvNamedWindow("2");
    	cvShowImage("2",img);
    	
    	CvSeq* contours = 0,* contoursTemp =0; 
    	cvZero(contoursImage);
    	
    	cvCvtColor(img,imgColor,CV_GRAY2BGR); //颜色转化函数
    
    	
    	//img :需要提前的图片需要二值
    	//storage:存放的空间
    	//contours:指向轮廓提取的第一个轮廓
    	//sizeof(CvContour):采用的是哪一种结构以及大小
    	//CV_RETR_LIST:轮廓存储方式
    	//CV_CHAIN_APPROX_NONE:采用坐标集表示轮廓
    	CvMemStorage* storage = cvCreateMemStorage(0);
    	int total = cvFindContours(img,storage,&contours,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_NONE,cvPoint(0,0)); 
    	printf("%d",total); //输出总的轮廓数
    	contoursTemp = contours;
    
    	while(contoursTemp!=0){
    		for(int i = 0;i<contoursTemp->total;i++){
    			CvPoint *pt = (CvPoint*)cvGetSeqElem(contoursTemp,i);
    			cvSetReal2D(contoursImage,pt->y,pt->x,255.0);
    			cvSet2D(imgColor,pt->y,pt->x,cvScalar(0,0,255.0));
    		}
    		contoursTemp = contoursTemp->h_next;  
    	}
    	cvNamedWindow("img");
    	cvShowImage("img",imgColor);
    	cvNamedWindow("contoursImage");
    	cvShowImage("contoursImage",contoursImage);
    	cvWaitKey(0);
    	return 0;
    }

    展开全文
  • 轮廓检测指的是将图像中物体的边界提取出来并在图中用封闭的曲线描绘出来。相比于边缘检测,轮廓检测所提取的曲线一定是封闭的,并且提取的均为目标的边界,边缘检测注重的是图像中灰度变化剧烈的区域,不一定是边界...

    轮廓检测指的是将图像中物体的边界提取出来并在图中用封闭的曲线描绘出来。相比于边缘检测,轮廓检测所提取的曲线一定是封闭的,并且提取的均为目标的边界,边缘检测注重的是图像中灰度变化剧烈的区域,不一定是边界。在opencv中使用cv2.findcontours()提取轮廓,cv2.drawcontours()绘制轮廓。低版本opencv中的findcontours函数返回三个值,图像、轮廓列表以及轮廓层析结构,高版本的不再返回图像。参数分别为输入图像、需要的轮廓类型mode、轮廓的近似方法method。其中mode分为以下几种:
    CV_RETR_EXTERNAL 只检测出最外轮廓即c0。图2中第一个轮廓指向最外的序列,除此之外没有别的连接。
    CV_RETR_LIST 检测出所有的轮廓并将他们保存到表(list)中,图2中描绘了这个表,被找到的9条轮廓相互之间由h_prev和h_next连接。这里并没有表达出纵向的连接关系,没有使用v_prev和v_next.
    CV_RETR_COMP 检测出所有的轮廓并将他们组织成双层的结构,第一层是外部轮廓边界,第二层边界是孔的边界。从图2可以看到5个轮廓的边界,其中3个包含孔。最外层边界c0有两个孔,c0之间的所有孔相互间由h_prev和h_next指针连接。
    CV_RETR_TREE 检测出所有轮廓并且重新建立网状的轮廓结构。图2中,根节点是最外层的边界c0,c0之下是孔h00,在同一层中与另一个孔h01相连接。同理,每个孔都有子节点(相对于c000和c010),这些子节点和父节点被垂直连接起来。这个步骤一直持续到图像最内层的轮廓,这些轮廓会成为树叶节点
    Method分为以下几种:
    CV_CHAIN_CODE 用freeman链码输出轮廓,其他方法输出多边形(顶点的序列)。
    CV_CHAIN_APPROX_NONE将链码编码中的所有点转换为点。
    CV_CHAIN_APPROX_SIMPLE压缩水平,垂直或斜的部分,只保存最后一个点。
    CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_QPPROX_TC89_KCOS使用Teh-Chin链逼近算法中的一个。
    CV_LINK_RUNS与上述的算法完全不同,连接所有的水平层次的轮廓。
    Drawcotours函数要输入的参数是图像、输入轮廓、要绘制轮廓的编号(若为腐蚀,则绘制所有的轮廓)、绘制的轮廓颜色、轮廓的粗细。

    展开全文
  • 图像处理-提取轮廓

    2020-07-29 14:20:50
    图像处理提取图片轮廓并换色。针对示例的几幅图片,编写MATLAB代码进行实现
  • 图像轮廓提取-Robert算子 图像的边缘:周围像素灰度有阶跃变化或“屋顶”变化的那些像素的集合,边缘广泛存在于物体与背景之间、物体与物体之间,基元与基元之间,是图像分割的重要依据。 物体的边缘是由灰度不...

    图像的轮廓提取-Robert算子

    图像的边缘:周围像素灰度有阶跃变化或“屋顶”变化的那些像素的集合,边缘广泛存在于物体与背景之间、物体与物体之间,基元与基元之间,是图像分割的重要依据。

    物体的边缘是由灰度不连续性形成的,经典的边缘提取方法是考察图像的每个像素在某个领域内灰度的变化,利用边缘邻近一阶或二阶方向倒数变化规律,用简单的方法检测边缘,这种方法称为边缘检测局部算子。

            public Bitmap Robert(Image image)
            {
                int width = image.Width;
                int height = image.Height;
    
                Bitmap temp=new Bitmap(width,height);
                Bitmap bitmap=(Bitmap)image;
    
                int x,y,p0,p1,p2,p3,result;
                Color[]pixel=new Color[4];
    
                for (y = height - 2; y > 0; y--)
                {
                    for (x = 0; x < width - 2; x++)
                    {
                        pixel[0] = bitmap.GetPixel( x, y );
                        pixel[1] = bitmap.GetPixel(x,y+1);
                        pixel[2] = bitmap.GetPixel( x + 1, y );
                        pixel[3] = bitmap.GetPixel( x + 1, y + 1 );
                        p0 = (int)(0.3 * pixel[0].R + 0.59 * pixel[0].G + 0.11 * pixel[0].B);
                        p1 = (int)(0.3 * pixel[1].R + 0.59 * pixel[1].G + 0.11 * pixel[1].B);
                        p2 = (int)(0.3 * pixel[2].R + 0.59 * pixel[2].G + 0.11 * pixel[2].B);
                        p3 = (int)(0.3 * pixel[3].R + 0.59 * pixel[3].G + 0.11 * pixel[3].B);
                        result = (int)Math.Sqrt( (p0 - p3) * (p0 - p3) + (p1 - p2) * (p1 - p2) );
                        if (result > 255)
                            result = 255;
                        if (result < 0)
                            result = 0;
                        temp.SetPixel( x, y, Color.FromArgb( result, result, result ) );
                    }
                }
                return temp;
            }

     

    转载于:https://www.cnblogs.com/chenyongblog/p/3407426.html

    展开全文
  • 几种方法用来提取图像轮廓的例子

    万次阅读 2017-05-15 09:15:56
    参考了许多博客,自己整理了一下几种方法用来提取图像轮廓的方法,记录一下

    参考了许多博客,自己整理了一下几种方法用来提取图像轮廓的方法,记录一下

    #include<opencv2\core\core.hpp>
    #include<opencv2\highgui\highgui.hpp>
    #include<opencv2\imgproc\imgproc.hpp>
    #include<iostream>
    
    using namespace cv;
    using namespace std;
    
    
    //方法1
    void Contours1(Mat &image)
    {
    
    	//将image由彩色图像转换成灰度图像
    	cvtColor(image,image,CV_BGR2GRAY);
    	//再通过阈值函数将其转换为二值图像
    	threshold(image,image,160,255,THRESH_BINARY);//设置阈值为160,最大像素值为255
    	vector<vector<Point>> contours;
    	//find轮廓
    	findContours(image,contours,1,CHAIN_APPROX_SIMPLE);
    	//draw轮廓
    	Mat result=Mat::zeros(image.size(),CV_8UC1);
    	if(!contours.empty())
    	{
    		//result:存放轮廓,contours:找到的轮廓,-1:将所有轮廓画出,Scalar(255):由白色画,2:画笔粗细
    	drawContours(result,contours,-1,Scalar(255),2);
    	imshow("处理图",result);
    	}
    	
    }
    
    //方法2
    void Contours2(Mat &image)
    {
    	Mat img1=Mat::zeros(image.size(),CV_8UC1);
    	//将image由彩色图像转换成灰度图像
    	cvtColor(image,image,CV_RGB2GRAY);
    	//通过阈值函数将其转换为二值图像img1(大小与image一样,是单通道)
    	threshold(image,img1,160,255,THRESH_BINARY);//设置阈值为160,最大像素值为255
    	vector<vector<Point> >contours;//contours轮廓
    	vector<Vec4i> hierarchy;//hierarchy层次
    	//查找轮廓findContours
    	findContours(img1,contours,hierarchy,CV_RETR_CCOMP,CHAIN_APPROX_SIMPLE);
    	//初始化dst
    	Mat dst=Mat::zeros(image.size(),CV_8UC1);
    	//开始处理
    	if(!contours.empty()&&!hierarchy.empty())
    	{	//循环轮廓数
    		for (int i = 0; i < contours.size(); i++)
    		{
    			//循环当前轮廓下的每一个点,contours[i].size()是当前轮廓下的总点数
    			for (int j = 0; j < contours[i].size(); j++)
    			{
    				Point p=Point(contours[i][j].x,contours[i][j].y);
    				//给当前轮廓下的每个点设置白色
    				dst.at<uchar>(p)=255;
    			}
    				//drawContours绘制填充当前的轮廓i
    			drawContours(img,contours,i,Scalar(255),1,8,hierarchy);
    
    		}
    	}
    	imshow("处理图",dst);
    }
    
    //方法3
    void Contours3(Mat &image)
    {
    	Mat img;
    	GaussianBlur(image,img,Size(3,3),0);
    	Canny(img,img,100,250);
    	//定义点和向量
    	vector<vector<Point> >contours;//contours轮廓
    	vector<Vec4i> hierarchy;//hierarchy层次
    	//查找轮廓findContours
    	//参数1:为二值图像,可以是灰度图像,一般是经过Canny,拉普拉斯等边缘检测算子处理过的二值图像
    	//参数2:contours是一个双向的向量,向量内每个元素保存了一组由连续Point点构成的点集合向量,
    	//-------每一组点集就是一个轮廓,有多少轮廓contours就有多少元素
    	//参数3:hierarchy向量中每一个元素包含了4个int变量:hierarchy[i][0]~hierarchy[i][3]分别表示第i个轮廓的后一个,前一个,父,内嵌轮廓
    	//-------hierarchy向量内的元素和contours轮廓向量内的元素是一一对应的,向量的容量相同。
    	//参数4:定义轮廓的检索模式
    	//参数5:定义轮廓的近似方法
    	//参数6:Point偏移量,所有轮廓信息相对于原始图像对应点的偏移量
    	findContours(img,contours,hierarchy,CV_RETR_CCOMP,CHAIN_APPROX_SIMPLE);
    	//初始化dst
    	Mat dst=Mat::zeros(img.size(),CV_8UC1);
    	//开始处理
    	if(!contours.empty()&&!hierarchy.empty())
    	{	
    		for (int i = 0; i < contours.size(); i++)
    		{
    			for (int j = 0; j < contours[i].size(); j++)
    			{
    			   
    				Point p=Point(contours[i][j].x,contours[i][j].y);
    				dst.at<uchar>(p)=255;
    			}
    				//绘制填充轮廓
    			drawContours(img,contours,i,Scalar(255),1,8,hierarchy);
    
    		}
    	}
    	imshow("处理图",dst);
    
    }
    
    //方法4
    void Contours4(Mat &img)
    {
        //将image由彩色图像转换成灰度图像
        cvtColor(img,img,CV_RGB2GRAY);
        //通过阈值转换成二值图像 
        Mat bw=(threshval<128)?(img<threshval):(img>threshval);
        vector<vector<Point>> contours;
        //find轮廓
        findContours(bw,contours,1,CHAIN_APPROX_SIMPLE);
        //draw轮廓
        Mat result=Mat::zeros(img.size(),CV_8UC1);
        if(!contours.empty())
        {
            //result:存放轮廓,contours:找到的轮廓,-1:将所有轮廓画出,Scalar(255):由白色画,2:画笔粗细
        drawContours(result,contours,-1,Scalar(255),2);
        imshow("处理图",result);
        }
    }
    
    int main()
    {
    	img=imread("img/logo.png",1);
    	
    	namedWindow("1");
    	imshow("1",img);
    
    	//创建处理窗口
    	namedWindow("处理图");
    	Contours1(img);//方法1 
            Contours2(img);//方法2
            Contours3(img);//方法3
            Contours4(img);//方法4
    waitKey();
    return 0;
    }
    
    

    
    

    
    
    展开全文
  • 形态学轮廓提取&人脸边缘轮廓检测
  • 图像预处理-寻找图像轮廓的骨架 由于图片中的对象之间互相粘连和遮挡,因此必须前景进行细化,尽量使不同目标之间分开,更有利于后续的骨架提取。Opencv自带寻找轮廓的函数:流程是:获取灰度图→图片二值化→寻找...
  • 使用Matlab对二值图像进行轮廓提取

    万次阅读 多人点赞 2017-02-22 21:43:56
    转自:... 本文主要总结一下在matlab中可用于进行轮廓提取的函数。 1 bwperim  根据参考资料[2]的提示,可以使用bwperim()函数进行轮廓提取,具体代码如下:%读取原图 im = imread( filepath );
  • 近期由于项目需要,需要使用python的opencv库处理图像,在下面的代码中使用了很多cv2的库函数,对这些函数进行了封装,可以直接拷贝调用.项目地址 该部分有两个文件构成 main.py 和 replace.py 运行...
  • 边缘检测与轮廓检测有什么区别?

    万次阅读 2018-11-23 15:54:43
    边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。 这些包括(i)深度上的不连续、(ii)表面方向不连续、...
  • 使用matlab对图像轮廓进行提取

    万次阅读 热门讨论 2019-01-26 22:28:47
    然后转为二值图像使用bwperim()函数进行轮廓提取 同样我们可以借助edge()函数进行边界检测,算子可以选择canny,soble等等。  算子是什么呢? 简单的说就是一种运算方式,一种关系,一种映射。 广义的讲,...
  • Matlab实现图像轮廓提取

    千次阅读 2018-05-10 22:18:47
    以二值图像circles.png(黑色背景白色前景)为例,根据掏空内部点算法,运用Matlab编程实现二值图像轮廓提取。 I=imread('circles.png'); [M,N]=size(I); buffer=I; for i=2:M-1 for j=2:N-1 if(I(i,j)==255&...
  • 利用edge()函数提取图像轮廓,绘制出对象的边界和提取边界坐标信息,matlab实现代码如下: close all;clear all;clc; % 提取图像轮廓提取图像边缘 I = imread('yifu.jpg'); c = im2bw(I,graythresh(I)); ...
  • 对于拍摄的图像,目标物的颜色与背景颜色相差不大,这导致边缘提取便的很困难, 很难提取出封闭的轮廓区域,所以想问一下,有什么好的方法可以增强对比度的方法吗? 使得前景与背景的颜色辨识度高,以便于后期的边缘...
  • halcon边缘提取和检测常用方法

    万次阅读 2015-07-17 11:32:01
    这样做的目的是进一步减少目标区域,通过二值化将目标区域大概轮廓提取出来 3、提取最接近目标区域的轮廓 常用函数有boundary,gen_contour_region_xld 4、根据自己的需求提取需要的初步轮廓 5、将初步提取的初步...
  • PS提取图形轮廓

    万次阅读 2017-07-09 14:37:23
    需要做图形轮廓相关的程序,所以记录一下其中的一些处理过程备忘,和程序没有太大关系。 打开文件启动PS软件,从文件——打开中,打开JPG格式的图片,如下: 查找边缘 滤镜——风格化——查找边缘 为了获得更...
  • 关于“轮廓检测”和“边缘检测”这两个自己也弄的不是特别清楚,可能确实比较相似吧。下面简单说一下自己的看法。 区别: 边缘检测主要是通过一些手段检测数字图像中明暗变化剧烈(即梯度变化比较大)像素点,偏向...
  • OpenCV提取图像轮廓总结

    千次阅读 2014-06-06 14:42:33
    OpenCV提取图像轮廓总结
  • OpenCV与EmguCV中的图像轮廓提取

    万次阅读 2016-07-19 12:55:22
    轮廓图像中表示边界的一系列...openCV中可以用findContours()函数来从二值图像提取轮廓。openCV中一般用序列来存储轮廓信息。序列中的每一个元素是曲线中一个点的位置。函数findContours()从二值图像中寻找轮廓。f
  • Halcon实现边缘提取

    万次阅读 2017-08-08 16:07:41
    一、边缘提取 ...这样做的目的是进一步减少目标区域,通过二值化将目标区域大概轮廓提取出来3、提取最接近目标区域的轮廓 常用函数有boundary,gen_contour_region_xld4、根据自己的需求提取需要的初步
1 2 3 4 5 ... 20
收藏数 16,023
精华内容 6,409
关键字:

图像处理 轮廓提取