• 图像的边缘、轮廓检测在人类视觉和计算机视觉中均起着重要的作用。人类能够仅凭一张背景剪影或一张草图就能识别出物体的类型和姿态。OpenCV提供了许多边缘检测l滤波函数,包括Laplacian( )、Sobel()以及Scharr()...

    图像的边缘、轮廓检测在人类视觉和计算机视觉中均起着重要的作用。人类能够仅凭一张背景剪影或一张草图就能识别出物体的类型和姿态。OpenCV提供了许多边缘检测l滤波函数,包括Laplacian( )、Sobel()以及Scharr()。这些函数都能将边缘转化为白色或其他饱和的颜色,将非边缘转化为黑色,但是,这些函数不能有效的区分噪声错误的判断为边缘。解决这个问题的办法是对图像进行模糊处理。这里介绍一种很方便却很实用的函数——Canny边缘检测。

    Canny函数中包含两个阈值这也是与其他边缘检测函数不同的地方。阈值是来确定哪里是边缘位置。阈值越低,能够检测出的边线越多,结果也就越容易受到图片噪声的影响,并且越容易从图像中挑出不相关的特性。与此相反,一个高的阈值将会遗失细的或者短的线段。因此,Canny函数中要设置两个阈值是有不同用处的。高的那个阈值是将要提取轮廓的物体与背景区分开来,就像阈值分割的那个参数一样,是决定目标与背景对比度的,低的那个阈值是用来平滑边缘的轮廓,有时高的阈值设置太大了,可能边缘轮廓不连续或者不够平滑,通过低阈值来平滑轮廓线,或者使不连续的部分连接起来。

    import cv2
    from matplotlib import pyplot as plt
    img = cv2.imread("water_coins.jpg", 0)
    edges = cv2.Canny(img, 200, 300)
    plt.subplot(1,2,1), plt.imshow(img,cmap = 'gray')
    plt.title('Original Image'), plt.xticks([]), plt.yticks([])
    plt.subplot(1,2,2), plt.imshow(edges,cmap = 'gray')
    plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
    plt.show()



    那么对图像的轮廓检测,先要将图像二值化操作,然后再调用findContours()函数。

    import cv2
    import numpy as np
    
    img = np.zeros((200, 200), dtype=np.uint8)
    img[50:150, 50:150] = 255
    # 二值化处理
    ret, th = cv2.threshold(img, 127, 255, 0)
    # findcontours()函数。有三个参数:输入图像、层次类型和轮廓逼近方法。
    # 由函数返回的层次树相当重要:cv2.RETR_TREE参数会得到图像中轮廓的整体层次结构(contours)。如果只想得到最外面的轮廓,可以使用cv2.RETR_EXTERNAL。这对消除包含在其他轮廓中的轮廓很有用。
    # 第三个参数有两种方法:
    #cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1 cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法
    image, contours, hierarchy = cv2.findContours(th, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    # 色彩空间转换函数cv2.cvtColor()
    color = cv2.cvtColor(img, cv2.COLOR_BAYER_BG2BGR)
    # 画出轮廓,-1,表示所有轮廓,画笔颜色为(0, 255, 0),即Green,粗细为2
    img = cv2.drawContours(color, contours, -1, (0, 255, 0), 2)
    cv2.imwrite("contours.png", color)
    cv2.waitKey()
    cv2.destroyAllWindows()


    参考:

    《OpenCV 3计算机视觉Python语言实现》

      OpenCV帮助文档:http://docs.opencv.org/3.0.0/da/d22/tutorial_py_canny.html


    展开全文
  • 数字图像处理:如何通过背景相减提取物体轮廓? 因为在数学建模比赛中需要用到数字图像处理,从0开始学习,自己把期间做的笔记整理下来。不积跬步无以至千里。 一、理论 1、图像的数字化采集 图像采样就是按照图像...

    数字图像处理:如何通过背景相减提取物体轮廓?

    因为在数学建模比赛中需要用到数字图像处理,从0开始学习,自己把期间做的笔记整理下来。不积跬步无以至千里。

    一、理论

    1、图像的数字化采集

    图像采样就是按照图像空间的坐标测量该位置上像素的灰度值,对连续图像f(x,y)进行等间隔采样:

    公式1
    f(x,y)=[f(0,0)f(0,1)f(0,N1)f(1,0)f(1,1)f(1,N1)f(M1,0)f(M1,1)f(M1,N1)] f(x, y)=\left[\begin{array}{lll}{f(0,0)} & {f(0,1)} & {\dots} & {f(0, N-1)} \\ {f(1,0)} & {f(1,1)} & {\dots} & {f(1, N-1)} \\ {\cdots} & {} & {} \\ {f(M-1,0)} & {f(M-1,1)} & {\dots} & {f(M-1, N-1)}\end{array}\right]

    2、 高斯降噪

    高斯降噪的原理是利用高斯函数作为模板,与原始图像进行卷积达到降噪的目的。

    二维的高斯函数如下:

    公式2
    f(x,y)=(1/2πδ2)ex2+y22δ2 \mathrm{f}(\mathrm{x}, \quad \mathrm{y})=\left(1 / 2 \pi \delta^{2}\right) * \mathrm{e}^{-\frac{\mathrm{x}^{2}+\mathrm{y}^{2}}{2 \delta^{2}}}

    3、图片灰度化

    RGB颜色模式并不能反映图像的形态特征,只是从光学的原理上进行颜色的调配。图像灰度化处理可以作为图像处理的预处理步骤:

    将RGB分量以不同的权值进行加权平均,得到较合理的灰度图像:

    公式3
    Gray(i,j)=0.299R(i,j)+0.578G(i,j)+0.114B(i,j) \operatorname{Gray}(i, j)=0.299 * R(i, j)+0.578 * G(i, j)+0.114 * B(i, j)

    4、直方图均衡化

    直方图均衡化是将原图像通过某种变换,得到一幅灰度直方图为均匀分布的新图像的方法,从而达到清晰图像的目的。

    https://blog.csdn.net/spongebob1234/article/details/77778709
    M为图像行数, 为图像列数, 为灰度值, 为灰度级的个数

    5、伽马变换

    在图像处理中,将漂白(相机过曝)的图片或者过暗(曝光不足)的图片,通过拉伸和压缩灰度级进行图片的灰度变换。
    result(i,j)=c×img(i,j)γ result(i, j) = c{\times}img(i, j)^{\gamma}

    6、背景相减

    result(i,j)={0,dis{[(i,j),(x0,y0)]}>2701,img(i,j)img2(i,j)>100, others  \operatorname{result}(i, j)=\left\{\begin{array}{lr}{0,} & {\operatorname{dis}\left\{\left[(i, j),\left(x_{0}, y_{0}\right)\right]\right\}>270} \\ {1,} & {i m g(i, j)-i m g 2(i, j)>10} \\ {0,} & {\text { others }}\end{array}\right.

    result表示结果矩阵, 为点 到点 的距离
    img表示前景图像矩阵
    img2表示背景图像矩阵

    7、连通性

    八连通或者四连通

    二、代码实现

    1、图片预处理

    %imagePreprocessing.mlx 图片预处理文件
    %路径变量
    imgPath = "2019 APMCM Problem A Attachment";        % 图像库路径
    imgPath2 = "colorGray"
    imgOutPutPath = "gray"
    histOutPutPath = "process_image"
    %处理灰色图
    
    imgDir  = dir(imgPath); % 遍历所有bmp格式文件
    for i = 1 : length(imgDir) %遍历结构体
        if imgDir(i).name == "." || imgDir(i).name == ".."
            continue;
        end
    %导入图片
        name = imgDir(i).name
        imgPathName = strcat(imgPath, "\", name)
        img = imread(imgPathName); %读取每张图片
        
    %高斯降噪
        h_gaosi1=fspecial('gaussian',3,1);
        imageAfter=imfilter(img,h_gaosi1);
        imshow(imageAfter)
    %灰度处理
    grayImg = rgb2gray(img)  
    grayImg = im2double(grayImg);
    result = 1 * (grayImg .^ 2); 
    saveImgName = strcat(imgOutPutPath, "\", "gray_", name)
    imwrite(result, saveImgName);
    imhist(result);
    ylabel('出现频数');
    end
    
    
    %处理彩图
    imgDir2  = dir(imgPath2); % 遍历所有bmp格式文件
    for i = 1 : length(imgDir2) %遍历结构体
        if imgDir2(i).name == "." || imgDir2(i).name == ".."
            continue;
        end
    %导入图片
        name = imgDir2(i).name
        imgPathName = strcat(imgPath2, "\", name)
        img = imread(imgPathName); %读取每张图片
        
    %高斯降噪
        h_gaosi1=fspecial('gaussian',3,1);
        imageAfter=imfilter(img,h_gaosi1);
        imshow(imageAfter)
    %灰度处理
    grayImg = rgb2gray(img)
    result = grayImg
    saveImgName = strcat(imgOutPutPath, "\", "gray_", name)
    imwrite(result, saveImgName);
    imhist(result);
    ylabel('出现频数');
    end
    
    

    2、背景相减

    %ACPC.mxl 背景减除及二值化
    clear;
    clc;
    % i1=imread('D:\MATLAB\ACPCM\IMG_BW\516_bw.bmp');
    % i2=imread('D:\MATLAB\ACPCM\IMG_BW\610_bw.bmp');
    % i1=rgb2gray(i1);
    % i2=rgb2gray(i2);
    i1=imread('D:\MATLAB\ACPCM\gray\gray_0502.bmp');
    i2=imread('D:\MATLAB\ACPCM\gray\gray_0610.bmp');
    [m,n]=size(i1);
    im1=double(i1);
    im2=double(i2);
    i3=zeros(size(i1));
    for i=1:m
        for j=1:n
            if (((i-561)*(i-561))+((j-1047)*(j-1047))) > 270*270%研究区域半径占270个像素点
                  i3(i,j)=0;
            elseif abs((im1(i,j))-(im2(i,j))) > 8%最佳阈值在8~30之间
                  i3(i,j)=1;
            else 
                  i3(i,j)=0;
            end
        end
    end
    for i=10:m-10
        for j=10:n-10
            if i3(i-1,j-1)==1 && i3(i,j-1)==1 && i3(i-1,j)==1 && i3(i+1,j+1)==1  && i3(i-1,j+1)==1 && i3(i+1,j)==1 && i3(i,j+1)==1 && i3(i+1,j-1)==1 
                i3(i,j)=1;
            elseif i3(i-1,j-1)==0 && i3(i,j-1)==0 && i3(i-1,j)==0 && i3(i+1,j+1)==0  && i3(i-1,j+1)==0 && i3(i+1,j)==0 && i3(i,j+1)==0 && i3(i+1,j-1)==0 
                i3(i,j)=0; 
            end
        end
    end
    figure,imshow(i3);title('the result of 0502')
    imfill(i3, 'hole');
    contour = bwperim(i3);
    figure,imshow(contour);title('the contour of 0502')
    
    
    展开全文
  • 第十六章 物体测量与形状分析 目录 1. 物体测量 o 面积与周长 2. 形状描述特征 o 矩形度 o 圆形度 o 不变矩 o 轮廓的傅立叶描述子 3. 中轴变换与骨架提取 4. 曲线与表面的...

    第十六章 物体测量与形状分析

    目录

    1.    物体测量

    o       面积与周长

    2.    形状描述特征

    o       矩形度

    o       圆形度

    o       不变矩

    o       轮廓的傅立叶描述子

    3.    中轴变换与骨架提取

    4.    曲线与表面的拟合

    作业


    1.物体测量

        在物体从图象中分割出来后,进一步就可以对它的几何特征进行测量和分析,在此基础上可以识别物体,也可以对物体分类,或对物体是否符合标准进行判别,实现质量监控。与图象分割一道,物体测量与形状分析在工业生产中有重要的应用,它们是机器视觉的主要内容之一。例如,能将马铃薯或苹果等农产品按品质自动分类的机器视觉系统,自动计算不规则形状所包含面积的测量系统,将传送带上不同工件自动分类的视觉系统,等等。

    ·        面积与周长

        如下图所示,取物体的质心为坐标中心,平面上一闭合曲线所包围的面积由沿轮廓的积分确定:

       周长可以简单地通过计算物体边界上相邻象素的中心距的累加和得到,也可以从边界链码中计算得到[2]。

     
     

     

    2.形状描述特征

        当物体从图象中分割出来以后,形状描述特征与尺寸测量结合起来可以作为区分不同物体的依据,在机器视觉系统中起着十分重要的作用。

    ·        长度和宽度

        在已知物体的边界时,用其外接矩形的尺寸来刻画它的基本形状是最简单的方法。如果仅计算其在坐标系方向上的外接矩形是很简单的,只需计算物体边界点的最大和最小坐标值,就可得到物体的水平和垂直跨度。但通常需要计算反映物体形状特征的主轴方向上的长度和与之垂直方向上的宽度,这样的外接矩形是物体最小的外接矩形(MER-MinimumEnclosing Rectangle)。

        计算MER的一种方法是将物体在90度范围内等间隔地旋转,每次记录其坐标系方向上的外接矩形参数,取其面积为最小的矩形的参数为主轴意义下的长度和宽度。通常主轴可以通过矩(moments)的计算得到,也可以用求物体的最佳拟合直线的方法求出。

     

    ·        矩形度

        矩形度用物体的面积与其最小外界矩形的面积之比来刻画,反映物体对其外接矩形的充满程度:

     
     

     

    ·        圆形度

        圆形度用来刻画物体边界的复杂程度,它们在圆形边界时取最小值。最常用的圆形度是周长的平方与面积的比。

     
     

     

    ·        不变矩

    矩的定义:对于二元有界函数f(x,y),它的(j+k)阶矩是:

     
     

     

    函数与其矩集合有一一对应的关系。

        为了描述形状,假设f(x,y)在物体内取值为1而在其外都取0值,这样它就与物体的轮廓建立了一个一一对应,它的矩就反映了物体的轮廓信息。

    中心矩具有位置无关性。

    物体的主心主轴方向可用如下公式求得:

     
     

     

    偏心率定义为:

     
     

     

    对于规格化的中心矩,存在七个不变矩组合[1],它们对于平移、旋转和尺度变化都是不变的:

     
     

     

    但是,由于图象中存在噪声等干扰因素,上述不变矩尤其是高阶不变矩是不稳定的,仅仅利用不变矩特征来识别物体是很不可靠的。

    ·        轮廓的傅立叶描述子

        设 P为边界轮廓上的任意一点,以边界轮廓上的点A为参照点,记 s为从 A到 P点的弧长,并设边界轮廓线的周长为 S,则 P点可表示成弧长的函数

     
     

     

    这样将物体的边界轮廓与周期函数相对应,因此可以用它的傅立叶变换系数来刻画其轮廓特征。由于傅立叶变换系数的模具有平移及旋转不变性,故可用傅立叶变换的系数向量作为特征来识别物体。在实现时,通常需要将其幅值规范化,如除以最大幅值或平均幅值,以便得到尺度无关的形状识别特征。

    3.中轴变换与骨架提取

        中轴变换是寻找所有满足如下条件的点及对应参数:以该点为中心存在一个包含于物体内的且与物体边界相切于两点的圆盘,该点的参数就是相应圆盘的半径。因此中轴变换就是得到物体的骨架和骨架上每点到物体边界的最短距离的过程。对于二值图象而言,中轴变换与物体形状一一对应,物体可以用它的中轴变换重建。但在实际上,由于离散化的原因,重构的物体与原物体存在细微的差别。

        骨架的抽取可以采用形态学方法,参见第八章。在抽取出骨架后,容易根据原图计算出每点到边界最短距离参数。此外,还有许多其它直接求出中轴变换的方法,如Voronoi图方法[2]。

    4.曲线与表面的拟合

        在图象分析中,为了描述物体的边界或其它特征,有时需要根据一组数据点集来拟合曲线与曲面。曲线与曲面的拟合是数值分析中重要的内容,通常使用最小均方误差准则来找出一定参数形式下的最佳拟合函数。具体选择什么参数形式与问题有关,通常采用多项式形式特别是二次多项式形式,而对于更为一般的情况也可采用样条函数形式。

        曲线拟合问题是,给定一个点集,找出一个函数使其均方误差最小:

     
     

     

        上述方法很容易推广到其它参数形式的拟合函数中。通常采用的拟合函数有圆或椭圆,或其它二次或三次多项式函数,此外还有高斯函数等等。实现时可用Matlab工具,非常方便。

    参考文献

    1.    Daisheng Luo, Pattern recognition and image processing, Chichester,Horwood Publishing, 1998 (This book is specificallyaimed at object shape,orientation, and arrangement analysis and classification)

    2.    章毓晋,图象工程(上册) 图象处理和分析,清华大学出版社, 北京,1999

    3.    Sing-Tze Bow, Pattern recognition and image preprocessing, M.Dekker, New York, 1992

    4.    Ferdinand van der Heijden, Image based measurement systems: objectrecognition and parameter estimation, John Wiley & Sons, Chichester, 1994.

    5.    D. H. Ballard, C. M. Brown, Computer Vision, Prentice-Hall,INC,Englewood Cliffs, New Jersey, 1982。

    作业

    1.    编写根据物体边界计算几何特征的程序,并根据形状特征(矩形度、圆形度、傅立叶描述子等)将物体分类和识别,如方形、圆形、细长形。

    2.    编写圆形物体拟合程序,根据图象中圆形物体边界上的若干点(通过鼠标拾取),用最小二乘法拟合,求出参数(圆心、半径)并画在图象上观察效果。

    3.    检索文献,找到一种本课程未讲的中轴变换方法,编制程序做中轴变换,写出报告。


    返回主目录 返回本章目录

    清华大学计算机系 艾海舟

    最近修改时间:2001年7月19日

    出处:http://media.cs.tsinghua.edu.cn/~ahz/digitalimageprocess/CourseImageProcess.html

    展开全文
  • 图像中目标物体的形状检测是图像识别中重要的技术之一,对物体进行检测并提取首先需要做的就是提取物体轮廓信息,然后再通过轮廓点集特征选择相应的算法进行处理,最后可得到物体的形状信息。轮廓形状是我们看到...

    图像中目标物体的形状检测是图像识别中重要的技术之一,对物体进行检测并提取首先需要做的就是提取物体的轮廓信息,然后再通过轮廓点集特征选择相应的算法进行处理,最后可得到物体的形状信息。轮廓形状是我们看到物体最开始的印象,轮廓提取的原理是通过对原图像进行二值化,利用边缘点连接的层次差别,提取位于数结构特征高的区域点集构成的集合,这部分最可能是物体的轮廓。

    OpenCV中提供了函数findContours()用于对物体轮廓进行检测,findContours相关参数的含义:

    void findContours(InputArray image,OutputArrayOfArrays contours,OutputArray hierarchy,int mode,int method,Point offsetPoint())

    参数image为输入图像,8位单通道二值图像;contours为检测到的轮廓,每个轮廓都在向量中;参数hierarchy为包含图像拓扑结构的信息;mode为可选获取轮廓的方法,常用参数为外轮廓CV_PETR_EXTERNAL,CV_PETR_LIST为检测所有轮廓的不包含继承关系,CV_RETR_TREE为检测所有轮廓的包含继承关系,CV_PETR_CCOMP为检测所有轮廓,但是仅仅建立两层包含关系;method为轮廓近似的方法,参数设置为CV_CHAIN_APPROX_NONE表示把轮廓上所有的点存储,CV_CHAIN_APPROX_SIMPLE表示只存储水平、垂直即对角直线的起始点;offest为可选的偏移量。

    #include "opencv2/highgui/highgui.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    
    using namespace cv;
    using namespace std;
    
    Mat srcImage;
    Mat src_gray;
    int thresh = 100;
    int max_thresh = 255;
    RNG rng(12345);
    
    void thresh_callback(int,void*)
    {
        Mat caany_output;
        vector<vector<point>> contours;
        vector<Vec4i> hierarchy;
        Canny(src_gray,caany_output,thresh,thresh*2,3);          
     findContours(caany_output,contours,hierarchy,CV_PETR_TREE,CV_CHAIN_APPROX_SIMPLE,Point(0,0));
        Mat drawing = Mat::zeros(caany_output.size(),CV_8UC3);
        for(int i = 0;i<contours.size();i++)
        {
            Scalar color = Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));
            drawContours(drwing,contours,i,color,2,8,hierarchy,0,Point());
        }
        namedWindow("contours",CV_WINDOW_AUTOSIZE);
        imshow("contours",drawing);
    }
    
    int main()
    {
        Mat srcImage = imread();
        cvtcolor(srcImage,src_gray,CV_BGR2GRAY);
        blur(src_gray,src_gray,Size(3,3));
        char* source_window = "srcImage";
        namedWindow(source_window,CV_WINDOW_AUTOSIZE);
        imshow(source_window,srcImage);
        createTrackbar("threth:","srcImage",&thresh,max_thresh,thresh_callback);
        thresh_callback(0,0);
        waitkey(0);
        return 0 ;
    }

     

    展开全文
  • 图像轮廓检测 (一)检测轮廓 在OpenCV-python中,使用cv2.findContours()函数来对图像进行轮廓检测。 返回三个值:image,contours,hierarchy contours指的是轮廓本身,hierarchy是每条轮廓对应的属性 cv2....

    图像轮廓检测

    (一)检测轮廓

    在OpenCV-python中,使用cv2.findContours()函数来对图像进行轮廓检测。

    返回三个值:image,contours,hierarchy

    contours指的是轮廓本身,hierarchy是每条轮廓对应的属性

    cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])

    参数:

    • 第一个参数是寻找轮廓的图像;
    • 第二个参数表示轮廓的检索模式:cv2.RETR_EXTERNAL表示只检测外轮廓    cv2.RETR_LIST检测的轮廓不建立等级关系,cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。cv2.RETR_TREE建立一个等级树结构的轮廓。
    • 第三个参数method为轮廓的近似方法。cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),  abs(y1-y2))=1。   cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩阵轮廓只需4个点来保存轮廓信息。    cv2.CHAIN_APPROX_TC89_L1,    cv2.CHAIN_APPROX_TC89_KCOS使用teh-Chini chain近似算法  

     (二)绘制轮廓

    OpenCV中使用cv2.drawContours在图像上绘制轮廓

    cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[,maxLevel[, offset ]]]]])

    参数:

    • 第一个参数传入所要绘制轮廓的背景图片
    • 第二个参数是轮廓本身
    • 第三个参数指定绘制轮廓中的哪条轮廓,如果是-1,则绘制其中的所有的轮廓。thickness表示的是轮廓的宽度,如果是-1(cv2.FILLED),表示为填充模式。

    (三)代码实现 

    # 轮廓检测
    img = cv2.imread('2.jpg')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 获取灰度图
    ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)  # 利用阈值自动选择的方法获取二值图像
    image, contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  # 检测轮廓
    cv2.drawContours(img, contours, -1, (0, 255, 0), 1)  # 画出轮廓
    cv2.imshow('gray', binary)
    cv2.imshow('res', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

     

     

    展开全文
  • OpenCV是一个很强大的视觉库,因此本次我们根据一个小例子来说明如何简单的绘制一个物体轮廓。  第一步:二值化  就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉...
  • OpenCV-Python Tutorials,包括对原文档种错误代码的纠正该章节分为以下四个小节:(一) Contours:Getting Started(轮廓:开始)(二) Contours Features(轮廓特征)(三) Contours Properties(轮廓属性)(四) ...
  • 本文主要介绍OpenCV自带轮廓检索函数findContours()的用法,让我们看看如何在一个二值图像中查找轮廓。函数cv2.findContours() 有三个参数,第一个是输入图像,第二个是轮廓检索模式,第三个是轮廓近似方法。返回值...
  • 目录 ...初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
  • OpenCV检测图像轮廓

    2016-08-22 11:53:18
    轮廓只不过是图像中连接的曲线,或者图像中连通部分的边界,轮廓通常以图像中的边缘来计算,但是,边缘和轮廓的区别在于轮廓是闭合的,而边缘可以是任意的。边缘的概念局限于点及其邻域像素,轮廓将目标作为整体进行...
  • 图像轮廓的提取

    2017-09-15 11:57:21
    图像边缘提取,常见的方式是先对图片进行灰度处理,然后再利用图像梯度算法提取出边框。我们先来看效果图   经过处理后的前后对比,可以看到,图形的轮廓已经大致提取了。现在来看实现的代码 using System; ...
  • 目标: 灰度化--->>>阈值化--->>...轮廓查找计数: 遇到的问题: A. 1.用下面这个自适应阈值必须进行数据的转换,不能直接传入数据!不然程序一直崩溃,找了很久才发现...
  • 通过结合几何HU不变矩作为中间的连接数据,再运用图像预处理和欧式距离等数学方法,用Matlab进行编程,完成各个部分的效果,实现区域图像轮廓特征数据获取,计算欧氏距离,根据物体图像几何HU不变距的相似程度实现物体...
  • 程序目的是对传送带上物件的定位,需要提取物件坐标。主要运用Opencv中的寻找轮廓函数findContours()作为程序核心,为了杂质的干扰,处理高斯滤波,做了一个轮廓面积的计算,来去除杂质
  • 参考了许多博客,自己整理了一下几种方法用来提取图像轮廓的方法,记录一下
  • 第一章概述图像概念:图:是物体透射或反射光的分布,客观存在 像:是人的视觉系统对图的接受在大脑中形成的印象或反映。 图像:是图和像的有机结合,是客观世界能量或状态以可视化形式在二维平面上的投影。 图像...
  • 关于边缘检测的基础来自于一个事实,即在边缘部分,像素值出现”跳跃“或者较大的变化。如果在此边缘部分求取一阶导数,就会看到极值的出现。...下面的代码展示了分别对灰度化的图像和原始彩色图像中的
  • 了解图像处理的基本概念和基本的函数调用 图像处理的级别划分 低级:包括原始操作,如降低噪声的图像预处理,对比度增强和图像锐化。特点是输入和输出都是图像。 中级:包括诸如分割这样的任务,即把图像分为...
  • 形态学图像处理

    2018-09-18 15:36:10
    形态学图像处理的基本理论是数学形态学(Mathematical morphology)。数学形态学的语言是集合论,集合表示图像中的对象。 在形态学中,集合的反射和平移广泛用来表达基于 结构元(SE) 的操作:研究一幅图像中感兴趣...
  • 以二值图像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&...
1 2 3 4 5 ... 20
收藏数 12,735
精华内容 5,094