图像分析与处理_vb人脸识别技术、图像处理 可用于人脸图像处理、梯度分析 - CSDN
精华内容
参与话题
  • 图像处理与分析

    2019-11-08 12:25:26
    1. Bilateral Filter Bilateral Filter俗称双边滤波器是一种简单实用的具有保持边缘作用的平缓滤波器,由Tomasi等在1998年提出。它现在已经发挥着重大作用,尤其是在HDR领域。 [1998 ICCV] Bilateral Filtering ...

    1. Bilateral Filter

    Bilateral Filter俗称双边滤波器是一种简单实用的具有保持边缘作用的平缓滤波器,由Tomasi等在1998年提出。它现在已经发挥着重大作用,尤其是在HDR领域。
     

    [1998 ICCV] Bilateral Filtering for Gray and Color Images

    [2008 TIP] Adaptive Bilateral Filter for Sharpness Enhancement and Noise Removal

    2. Color

    如果对颜色的形成有一定的了解,能比较深刻的理解一些算法。这方面推荐冈萨雷斯的数字图像处理中的相关章节以及SharmaDigital Color Imaging Handbook中的第一章“Color fundamentals for digital imaging”。跟颜色相关的知识包括Gamma,颜色空间转换,颜色索引以及肤色模型等,这其中也包括著名的EMD
     

    [1991 IJCV] Color Indexing

    [2000 IJCV] The Earth Mover's Distance as a Metric for Image Retrieval

    [2001 PAMI] Color invariance

    [2002 IJCV] Statistical Color Models with Application to Skin Detection

    [2003] A review of RGB color spaces

    [2007 PR]A survey of skin-color modeling and detection methods

    Gamma.pdf

    GammaFAQ.pdf

    3. Compression and Encoding

    个人以为图像压缩编码并不是当前很热的一个话题,原因前面已经提到过。这里可以看看一篇对编码方面的展望文章
     

    [2005 IEEE] Trends and perspectives in image and video coding

    4. Contrast Enhancement

    对比度增强一直是图像处理中的一个恒久话题,一般来说都是基于直方图的,比如直方图均衡化。冈萨雷斯的书里面对这个话题讲的比较透彻。这里推荐几篇个人认为不错的文章。
     

    [2002 IJCV] Vision and the Atmosphere

    [2003 TIP] Gray and color image contrast enhancement by the curvelet transform

    [2006 TIP] Gray-level grouping (GLG) an automatic method for optimized image contrast enhancement-part II

    [2006 TIP] Gray-level grouping (GLG) an automatic method for optimized image contrast Enhancement-part I

    [2007 TIP] Transform Coefficient Histogram-Based Image Enhancement Algorithms Using Contrast Entropy

    [2009 TIP] A Histogram Modification Framework and Its Application for Image Contrast Enhancement

    5. Deblur (Restoration)

    图像恢复或者图像去模糊一直是一个非常难的问题,尤其是盲图像恢复。港中文的jiaya jia老师在这方面做的不错,他在主页也给出了可执行文件。这方面的内容也建议看冈萨雷斯的书。这里列出了几篇口碑比较好的文献,包括古老的Richardson-Lucy方法,几篇盲图像恢复的综述以及最近的几篇文章,尤以FergusJiaya Jia的为经典。
     

    [1972] Bayesian-Based Iterative Method of Image Restoration

    [1974] an iterative technique for the rectification of observed distributions

    [1990 IEEE] Iterative methods for image deblurring

    [1996 SPM] Blind Image Deconvolution

    [1997 SPM] Digital image restoration

    [2005] Digital Image Reconstruction - Deblurring and Denoising

    [2006 Siggraph] Removing Camera Shake from a Single Photograph

    [2008 Siggraph] High-quality Motion Deblurring from a Single Image

    [2011 PAMI] Richardson-Lucy Deblurring for Scenes under a Projective Motion Path

    6. Dehazing and Defog

    严格来说去雾化也算是图像对比度增强的一种。这方面最近比较好的工作就是He kaiming等提出的Dark Channel方法。这篇论文也获得了2009CVPR 最佳论文奖。2这位003年的广东高考状元已经于2011年从港中文博士毕业加入MSRA(估计当时也就二十五六岁吧),相当了不起。
     

    [2008 Siggraph] Single Image Dehazing

    [2009 CVPR] Single Image Haze Removal Using Dark Channel Prior

    [2011 PAMI] Single Image Haze Removal Using Dark Channel Prior

    7. Denoising

    图像去噪也是图像处理中的一个经典问题,在数码摄影中尤其重要。主要的方法有基于小波的方法和基于偏微分方程的方法。
     

    [1992 SIAM] Image selective smoothing and edge detection by nonlinear diffusion. II

    [1992 SIAM] Image selective smoothing and edge detection by nonlinear diffusion

    [1992] Nonlinear total variation based noise removal algorithms

    [1994 SIAM] Signal and image restoration using shock filters and anisotropic diffusion

    [1995 TIT] De-noising by soft-thresholding

    [1998 TIP] Orientation diffusions

    [2000 TIP] Adaptive wavelet thresholding for image denoising and compression

    [2000 TIP] Fourth-order partial differential equations for noise removal

    [2001] Denoising through wavelet shrinkage

    [2002 TIP] The Curvelet Transform for Image Denoising

    [2003 TIP] Noise removal using fourth-order partial differential equation with applications to medical magnetic resonance images in space and time

    [2008 PAMI] Automatic Estimation and Removal of Noise from a Single Image

    [2009 TIP] Is Denoising Dead

    8. Edge Detection

    边缘检测也是图像处理中的一个基本任务。传统的边缘检测方法有基于梯度算子,尤其是Sobel算子,以及经典的Canny边缘检测。到现在,Canny边缘检测及其思想仍在广泛使用。关于Canny算法的具体细节可以在Sonka的书以及canny自己的论文中找到,网上也可以搜到。最快最直接的方法就是看OpenCV的源代码,非常好懂。在边缘检测方面,Berkeley的大牛J Malik和他的学生在2004年的PAMI提出的方法效果非常好,当然也比较复杂。在复杂度要求不高的情况下,还是值得一试的。MITBill Freeman早期的代表作Steerable Filter在边缘检测方面效果也非常好,并且便于实现。这里给出了几篇比较好的文献,包括一篇最新的综述。边缘检测是图像处理和计算机视觉中任何方向都无法逃避的一个问题,这方面研究多深都不为过。
     

    [1980] theory of edge detection

    [1983 Canny Thesis] find edge

    [1986 PAMI] A Computational Approach to Edge Detection

    [1990 PAMI] Scale-space and edge detection using anisotropic diffusion

    [1991 PAMI] The design and use of steerable filters

    [1995 PR] Multiresolution edge detection techniques

    [1996 TIP] Optimal edge detection in two-dimensional images

    [1998 PAMI] Local Scale Control for Edge Detection and Blur Estimation

    [2003 PAMI] Statistical edge detection_ learning and evaluating edge cues

    [2004 IEEE] Edge Detection Revisited

    [2004 PAMI] Design of steerable filters for feature detection using canny-like criteria

    [2004 PAMI] Learning to Detect Natural Image Boundaries Using Local Brightness, Color, and Texture Cues

    [2011 IVC] Edge and line oriented contour detection State of the art

    9. Graph Cut

    基于图割的图像分割算法。在这方面没有研究,仅仅列出几篇引用比较高的文献。这里又见J Malik,当然还有华人杰出学者Jianbo Shi,他的主页非常搞笑,在醒目的位置标注Do not fly China Eastern Airlines ... 看来是被坑过,而且坑的比较厉害。这个领域,俄罗斯人比较厉害。
     

    [2000 PAMI] Normalized cuts and image segmentation

    [2001 PAMI] Fast approximate energy minimization via graph cuts

    [2004 PAMI] What energy functions can be minimized via graph cuts

    10. Hough Transform

    虽然霍夫变换可以扩展到广义霍夫变换,但最常用的还是检测圆和直线。这方面同样推荐看OpenCV的源代码,一目了然。Matas2000年提出的PPHT已经集成到OpenCV中去了。
     

    [1986 CVGIU] A Survey of the Hough Transform

    [1989] A Comparative study of Hough transform methods for circle finding

    [1992 PAMI] Shapes recognition using the straight line Hough transform_ theory and generalization

    [1997 PR] Extraction of line features in a noisy image

    [2000 CVIU] Robust Detection of Lines Using the Progressive Probabilistic Hough Transform

    11. Image Interpolation

    图像插值,偶尔也用得上。一般来说,双三次也就够了
     

    [2000 TMI] Interpolation revisited

    12. Image Matting

    也就是最近,我才知道这个词翻译成中文是抠图,比较难听,不知道是谁开始这么翻译的。没有研究,请看文章以及Richard Szeliski的相关章节。以色列美女Levin在这方面有两篇PAMI
     

    [2008 Fnd] Image and Video Matting A Survey

    [2008 PAMI] A Closed-Form Solution to Natural Image Matting

    [2008 PAMI] Spectral Matting

    13. Image Modeling

    图像的统计模型。这方面有一本专门的著作Natural Image Statistics
     

    [1994] The statistics of natural images

    [2003 JMIV] On Advances in Statistical Modeling of Natural Images

    [2009 IJCV] Fields of Experts

    [2009 PAMI] Modeling multiscale subbands of photographic images with fields of Gaussian scale mixtures

    14. Image Quality Assessment

    在图像质量评价方面,Bovik是首屈一指的。这位老师也很有意思,作为编辑出版了很多书。他也是IEEEFellow
     

    [2004 TIP] Image quality assessment from error visibility to structural similarity

    [2011 TIP] blind image quality assessment From Natural Scene Statistics to Perceptual Quality

    15. Image Registration

    图像配准最早的应用在医学图像上,在图像融合之前需要对图像进行配准。在现在的计算机视觉中,配准也是一个需要理解的概念,比如跟踪,拼接等。在KLT中,也会涉及到配准。这里主要是综述文献。
     

    [1992 MIA] Image matching as a diffusion process

    [1992 PAMI] A Method for Registration of 3-D shapes

    [1992] a survey of image registration techniques

    [1998 MIA] A survey of medical image registration

    [2003 IVC] Image registration methods a survey

    [2003 TMI] Mutual-Information-Based Registration of Medical Survey

    [2011 TIP] Hairis registration

    16. Image Retrieval

    图像检索曾经很热,在2000年之后似乎消停了一段时间。最近各种图像的不变性特征提出来之后,再加上互联网搜索的商业需求,这个方向似乎又要火起来了,尤其是在商业界,比如淘淘搜。这仍然是一个非常值得关注的方面。而且图像检索与目标识别具有相通之处,比如特征提取和特征降维。这方面的文章值得一读。在最后给出了两篇Book chapter,其中一篇还是中文的。
     

    [2000 PAMI] Content-based image retrieval at the end of the early years

    [2000 TIP] PicToSeek Combining Color and Shape Invariant Features for Image Retrieval

    [2002] Content-Based Image Retrieval Systems A Survey

    [2008] Content-Based Image Retrieval-Literature Survey

    [2010] Plant Image Retrieval Using Color,Shape and Texture Features

    [2012 PAMI] A Multimedia Retrieval Framework Based on Semi-Supervised Ranking and Relevance Feedback

    CBIR Chinese

    fundament of cbir

    17. Image Segmentation

    图像分割,非常基本但又非常难的一个问题。建议看Sonka和冈萨雷斯的书。这里给出几篇比较好的文章,再次看到了J Malik。他们给出了源代码和测试集,有兴趣的话可以试试。
     

    [2004 IJCV] Efficient Graph-Based Image Segmentation

    [2008 CVIU] Image segmentation evaluation A survey of unsupervised methods

    [2011 PAMI] Contour Detection and Hierarchical Image Segmentation

    18. Level Set

    大名鼎鼎的水平集,解决了Snake固有的缺点。Level set的两位提出者SethianOsher最后反目,实在让人遗憾。个人以为,这种方法除了迭代比较费时,在真实场景中的表现让人生疑。不过,2008ECCV上的PWP方法在结果上很吸引人。在重初始化方面,Chunming Li给出了比较好的解决方案
     

    [1995 PAMI] Shape modeling with front propagation_ a level set approach

    [2001 JCP] Level Set Methods_ An Overview and Some Recent Results

    [2005 CVIU] Geodesic active regions and level set methods for motion estimation and tracking

    [2007 IJCV] A Review of Statistical Approaches to Level Set Segmentation

    [2008 ECCV] Robust Real-Time Visual Tracking using Pixel-Wise Posteriors

    [2010 TIP] Distance Regularized Level Set Evolution and its Application to Image Segmentation

    19. Pyramid

    其实小波变换就是一种金字塔分解算法,而且具有无失真重构和非冗余的优点。Adelson1983年提出的Pyramid优点是比较简单,实现起来比较方便。
     

    [1983] The Laplacian Pyramid as a Compact Image Code

    20. Radon Transform

    Radon变换也是一种很重要的变换,它构成了图像重建的基础。关于图像重建和radon变换,可以参考章毓晋老师的书,讲的比较清楚。
     

    [1993 PAMI] Image representation via a finite Radon transform

    [1993 TIP] The fast discrete radon transform I theory

    [2007 IVC] Generalised finite radon transform for N×N images

    21. Scale Space

    尺度空间滤波在现代不变特征中是一个非常重要的概念,有人说SIFT的提出者Lowe是不变特征之父,而Linderburg是不变特征之母。虽然尺度空间滤波是Witkin最早提出的,但其理论体系的完善和应用还是Linderburg的功劳。其在1998IJCV上的两篇文章值得一读,不管是特征提取方面还是边缘检测方面。
     

    [1987] Scale-space filtering

    [1990 PAMI] Scale-Space for Discrete Signals

    [1994] Scale-space theory A basic tool for analysing structures at different scales

    [1998 IJCV] Edge Detection and Ridge Detection with Automatic Scale Selection

    [1998 IJCV] Feature Detection with Automatic Scale Selection

    22. Snake

    活动轮廓模型,改变了传统的图像分割的方法,用能量收缩的方法得到一个统计意义上的能量最小(最大)的边缘。
     

    [1987 IJCV] Snakes Active Contour Models

    [1996 ] deformable model in medical image A Survey

    [1997 IJCV] geodesic active contour

    [1998 TIP] Snakes, shapes, and gradient vector flow

    [2000 PAMI] Geodesic active contours and level sets for the detection and tracking of moving objects

    [2001 TIP] Active contours without edges

    23. Super Resolution

    超分辨率分析。对这个方向没有研究,简单列几篇文章。其中Yang Jianchao的那篇在IEEE上的下载率一直居高不下。
     

    [2002] Example-Based Super-Resolution

    [2009 ICCV] Super-Resolution from a Single Image

    [2010 TIP] Image Super-Resolution Via Sparse Representation

    24. Thresholding

    阈值分割是一种简单有效的图像分割算法。这个topic在冈萨雷斯的书里面讲的比较多。这里列出OTSU的原始文章以及一篇不错的综述。
     

    [1979 IEEE] OTSU A threshold selection method from gray-level histograms

    [2001 JISE] A Fast Algorithm for Multilevel Thresholding

    [2004 JEI] Survey over image thresholding techniques and quantitative performance evaluation

    25. Watershed

    分水岭算法是一种非常有效的图像分割算法,它克服了传统的阈值分割方法的缺点,尤其是Marker-Controlled Watershed,值得关注。Watershed在冈萨雷斯的书里面讲的比较详细。
     

    [1991 PAMI] Watersheds in digital spaces an efficient algorithm based on immersion simulations

    [2001]The Watershed Transform Definitions, Algorithms and Parallelizat on Strategies

     

    展开全文
  • 本书是在第3版中文翻译的基础上,按照直译的原则进行翻译的,英文版形成完全的对照。对于英文版中明显存在的排印或疏忽类的错误,都进行了更正。由于这些错误一般都很明显,因此译文中没有专门声明,读者如果对照...
  • 图像分割方法总结

    一、灰度阈值法
    1、全局阈值法
    整幅图像使用同一个阈值做分割处理,适用于目标物和背景有明显对比的图像。这种方法是只考虑像素值不考虑空间特征的,例如峰谷法、最大熵分割法。
    如下是一维最大熵分割法实现。
    最大熵原理:只掌握关于未知分布的部分知识时,应选取符合这些知识的但是熵值最大的概率分布。因为熵越大,随机变量的不确定性越大,做准确预测的难度越大。

    int maxEntropy(IplImage *src);
    float calEntropy(CvHistogram *hist,int begin,int end);
    
    int main()
    {
        //Mat img =imread("E:/b.jpg",1);
    
        IplImage *src=cvLoadImage("G:\\4.bmp",CV_LOAD_IMAGE_GRAYSCALE); 
        IplImage *dst = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
        int threshold=maxEntropy(src);
         cvThreshold(src, dst, threshold, 255, CV_THRESH_BINARY); 
         //imshow("一维最大熵分割",img);
         cvNamedWindow("一维最大熵分割");
         cvShowImage("一维最大熵分割", dst);
         cvWaitKey(0);
         return 0;
    }
    
    int maxEntropy(IplImage *src)
    {
        assert(src);
        assert(src->depth == 8);  
        assert(src->nChannels == 1);
    
        int sizes=256;
        float range[2]={0,255};
        float *ranges[1]={&range[0]};
        CvHistogram *hist = cvCreateHist(1, &sizes, CV_HIST_ARRAY, ranges, 1);
        cvCalcHist(&src,hist,0,0);
        cvNormalizeHist(hist,0);
    
        int threthold=0;
        int Entropy_max=0;
        for(int i=0;i<sizes;i++)
        {
            float entropy=calEntropy(hist,0,i)+calEntropy(hist,i,sizes);
            if(entropy>=Entropy_max)
                Entropy_max=entropy;
        }
        return Entropy_max;
    }
    
    float calEntropy(CvHistogram *hist,int begin,int end)
    {
        float total=0;//总概率
        for(int i=begin;i<end;i++)
        {
            total+=cvQueryHistValue_1D(hist,i);
        }
        float entropy=0;
        for(int i=begin;i<end;i++)
        {
            float probability=cvQueryHistValue_1D(hist,i);
            if(probability==0)
                continue;
            probability/=total;
            entropy-=probability*log(probability);
        }
    
        return entropy;
    }

    2、自适应阈值法
    在许多情况下,目标和背景的对比度在图像中的各处是不一样的,实际处理时,需要按照具体情况将图像分成若干子区域分别选择阈值,或者动态地根据一定的邻域范围选择每点处的阈值,进行图像分割。
    OTSU法,它是按图像的灰度特性,将图像分成背景和目标2部分。背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致2部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。
    以前在遥感影像灰度阈值分割上尝试了一些自适应阈值法,影像背景地物比较复杂,效果都不太理想。

    3、人工确定

    二、基于边缘的图像分割
    1、差分法
    图像差分,就是把两幅图像的对应像素值相减,以削弱图像的相似部分,突出显示图像的变化部分。【原理都是共通的,这个也是比较简单的变化检测方法】
    2、梯度法
    Canny\Sobel算子等,他们是里面包含有计算梯度幅值和方向的步骤,也是一种梯度算子吧。
    Canny 步骤:首先消除噪声,一般使用高斯平滑滤波;然后计算梯度幅值和方向;然后非极大值抑制,也就是说选择局部范围内的极大值,抑制局部范围内的非极大值;最后是双阈值算法检测和连接,这一步是为了保留主要边缘,剔除不连续的、次要的边缘。
    这里原理解释主要参考:
    http://blog.csdn.net/likezhaobin/article/details/6892176
    代码根据该博主提供的代码进行了重构
    http://blog.csdn.net/likezhaobin/article/details/6892629

    
    /*****
        int* M ;                       //梯度幅值 
        unsigned char* N;            //非极大值抑制结果
        double* Theta ;             //梯度方向 
    ******/
    void Gaussian(unsigned char* nImageData,unsigned char* pCanny,int nWidth,int nHeight);
    void nonMaximumSuppression(unsigned char *pCanny,unsigned char* N,int* M,double* Theta,int nWidth,int nHeight);//极大值抑制
    void doubleThresholdDetection(unsigned char* N,int* M,int nWidth,int nHeight);//双阈值检测
    void TraceEdge(int y, int x, int nThrLow, unsigned char* pResult, int *pMag, int nWidth,int nHeight);
    void main()
    {
        /******彩色图灰度化********/
        IplImage *colorImage=cvLoadImage("G:\\5.jpg",-1);//读图,获取彩色图指针
    
        int width=colorImage->width;
        int height=colorImage->height;
        int sizeofPixel=width*height;//像素数
        IplImage *opencvGrayImage=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);//定义变换后的灰度图指针
        char *gray=(char*)malloc(sizeof(char)*width*height);//存放转换后的灰度像素值
        for(int i=0;i<sizeofPixel;i++)
        {
            uchar b=(uchar)colorImage->imageData[3*i+0];
            uchar g = (uchar)colorImage->imageData[3 * i + 1];  
            uchar r = (uchar)colorImage->imageData[3 * i + 2];  
            gray[i] = r * 0.299 + g * 0.587 + b * 0.114;  
        }
        opencvGrayImage->imageData=gray;
    
        unsigned char* nImageData = new unsigned char[width*height];   //保存图像中的数据 
        for(int j=0; j<height; j++)                                     //获取数据
        {  
            for(int i=0; i<width; i++)  
                nImageData[j*width+i] = (unsigned char)opencvGrayImage->imageData[j*width+i];  
        }  
    
        unsigned char*pCanny = new unsigned char[width*height];        //为平滑后的图像数据分配内存  
        Gaussian(nImageData,pCanny,width,height);//高斯模糊,不太理解
    
        int* M = new int[width*height];                       //梯度幅值 
        unsigned char* N =new unsigned char[width*height];  //非极大值抑制结果
        double* Theta = new double[width*height];             //梯度方向 
        nonMaximumSuppression(pCanny,N,M,Theta,width,height);//非极大值抑制结果
        doubleThresholdDetection(N,M,width,height);//双阈值检测
        opencvGrayImage->imageData=(char*)N;
        cvNamedWindow("GrayImage",CV_WINDOW_AUTOSIZE);  
        cvShowImage("GrayImage",opencvGrayImage);               //显示灰度图  
        cvWaitKey(0);  
        cvDestroyWindow("GrayImage");
    }
    
    void Gaussian(unsigned char* nImageData,unsigned char* pCanny,int nWidth,int nHeight)
    {
        /****高斯滤波****/
        double nSigma = 0.4;                            //定义高斯函数的标准差  
        int nWidowSize = 1+2*ceil(3*nSigma);            //定义滤波窗口的大小  
        int nCenter = (nWidowSize)/2;                   //定义滤波窗口中心的索引
    
    
        double* nData = new double[nWidth*nHeight];                      //两次平滑的中间数据  
    
        //////////////////////生成一维高斯滤波系数//////////////////////////////////    
        double* pdKernal_2 = new double[nWidowSize*nWidowSize]; //定义一维高斯核数组  
        double  dSum_2 = 0.0;                                   //求和,进行归一化        
        ///////////////////////二维高斯函数公式////////////////////////////////////      
        ////                         x*x+y*y                        ///////////////  
        ////                   -1*--------------                ///////////////  
        ////         1             2*Sigma*Sigma                ///////////////  
        ////   ---------------- e                                   ///////////////  
        ////   2*pi*Sigma*Sigma                                     ///////////////  
        ///////////////////////////////////////////////////////////////////////////  
        for(int i=0; i<nWidowSize; i++)  
        {  
            for(int j=0; j<nWidowSize; j++)  
            {  
                int nDis_x = i-nCenter;  
                int nDis_y = j-nCenter;  
                pdKernal_2[i+j*nWidowSize]=exp(-(1/2)*(nDis_x*nDis_x+nDis_y*nDis_y)  
                    /(nSigma*nSigma))/(2*3.1415926*nSigma*nSigma);  
                dSum_2 += pdKernal_2[i+j*nWidowSize];  
            }  
        }  
        for(int i=0; i<nWidowSize; i++)  
        {  
            for(int j=0; j<nWidowSize; j++)                 //进行归一化  
            {  
                pdKernal_2[i+j*nWidowSize] /= dSum_2;  
            }  
        }  
        int x;  
        int y;  
        for(int i=0; i<nHeight; i++)  
        {  
            for(int j=0; j<nWidth; j++)  
            {  
                double dFilter=0.0;  
                double dSum = 0.0;  
                for(x=(-nCenter); x<=nCenter; x++)                     //行  
                {  
                    for(y=(-nCenter); y<=nCenter; y++)             //列  
                    {  
                        if( (j+x)>=0 && (j+x)<nWidth && (i+y)>=0 && (i+y)<nHeight) //判断边缘  
                        {  
                            dFilter += (double)nImageData [(i+y)*nWidth + (j+x)]  
                            * pdKernal_2[(y+nCenter)*nWidowSize+(x+nCenter)];  
                            dSum += pdKernal_2[(y+nCenter)*nWidowSize+(x+nCenter)];  
                        }  
                    }  
                }  
                pCanny[i*nWidth+j] = (unsigned char)dFilter/dSum;  
            }  
        }
    }
    
    void nonMaximumSuppression(unsigned char *pCanny,unsigned char* N,int* M,double* Theta,int nWidth,int nHeight)
    {
        //////////////////同样可以用不同的检测器/////////////////////////  
        /////    P[i,j]=(S[i,j+1]-S[i,j]+S[i+1,j+1]-S[i+1,j])/2     /////  
        /////    Q[i,j]=(S[i,j]-S[i+1,j]+S[i,j+1]-S[i+1,j+1])/2     /////  
        /////////////////////////////////////////////////////////////////  
        double* P = new double[nWidth*nHeight];                 //x向偏导数  
        double* Q = new double[nWidth*nHeight];                 //y向偏导数  
    
    
        //计算x,y方向的偏导数  
        for(int i=0; i<(nHeight-1); i++)  
        {  
            for(int j=0; j<(nWidth-1); j++)  
            {  
                P[i*nWidth+j] = (double)(pCanny[i*nWidth + min(j+1, nWidth-1)] - pCanny[i*nWidth+j] + pCanny[min(i+1, nHeight-1)*nWidth+min(j+1, nWidth-1)] - pCanny[min(i+1, nHeight-1)*nWidth+j])/2;  
                Q[i*nWidth+j] = (double)(pCanny[i*nWidth+j] - pCanny[min(i+1, nHeight-1)*nWidth+j] + pCanny[i*nWidth+min(j+1, nWidth-1)] - pCanny[min(i+1, nHeight-1)*nWidth+min(j+1, nWidth-1)])/2;  
            }  
        }  
        //计算梯度幅值和梯度的方向  
        for(int i=0; i<nHeight; i++)  
        {  
            for(int j=0; j<nWidth; j++)  
            {  
                M[i*nWidth+j] = (int)(sqrt(P[i*nWidth+j]*P[i*nWidth+j] + Q[i*nWidth+j]*Q[i*nWidth+j])+0.5);  
                Theta[i*nWidth+j] = atan2(Q[i*nWidth+j], P[i*nWidth+j]) * 57.3;  
                if(Theta[i*nWidth+j] < 0)  
                    Theta[i*nWidth+j] += 360;              //将这个角度转换到0~360范围  
            }  
        }  
    
        //非极大值抑制
    
        int g1=0, g2=0, g3=0, g4=0;                            //用于进行插值,得到亚像素点坐标值  
        double dTmp1=0.0, dTmp2=0.0;                           //保存两个亚像素点插值得到的灰度数据  
        double dWeight=0.0;                                    //插值的权重
    
        //对边界进行初始化
        for(int i=0; i<nWidth; i++)  
        {  
            N[i] = 0;  
            N[(nHeight-1)*nWidth+i] = 0;  
        }  
        for(int j=0; j<nHeight; j++)  
        {  
            N[j*nWidth] = 0;  
            N[j*nWidth+(nWidth-1)] = 0;  
        }  
        //局部最大值查找
        for(int i=1; i<(nWidth-1); i++)  
        {  
            for(int j=1; j<(nHeight-1); j++)  
            {  
                int nPointIdx = i+j*nWidth;       //当前点在图像数组中的索引值  
                if(M[nPointIdx] == 0)  
                    N[nPointIdx] = 0;         //如果当前梯度幅值为0,则不是局部最大对该点赋为0  
                else  
                {  
                    ////////首先判断属于那种情况,然后根据情况插值///////  
                    ////////////////////第一种情况///////////////////////  
                    /////////       g1  g2                  /////////////  
                    /////////           C                   /////////////  
                    /////////           g3  g4              /////////////  
                    /////////////////////////////////////////////////////  
                    if( ((Theta[nPointIdx]>=90)&&(Theta[nPointIdx]<135)) ||   
                        ((Theta[nPointIdx]>=270)&&(Theta[nPointIdx]<315)))  
                    {  
                        //////根据斜率和四个中间值进行插值求解  
                        g1 = M[nPointIdx-nWidth-1];  
                        g2 = M[nPointIdx-nWidth];  
                        g3 = M[nPointIdx+nWidth];  
                        g4 = M[nPointIdx+nWidth+1];  
                        dWeight = fabs(P[nPointIdx])/fabs(Q[nPointIdx]);   //反正切  
                        dTmp1 = g1*dWeight+g2*(1-dWeight);  
                        dTmp2 = g4*dWeight+g3*(1-dWeight);  
                    }  
                    ////////////////////第二种情况///////////////////////  
                    /////////       g1                      /////////////  
                    /////////       g2  C   g3              /////////////  
                    /////////               g4              /////////////  
                    /////////////////////////////////////////////////////  
                    else if( ((Theta[nPointIdx]>=135)&&(Theta[nPointIdx]<180)) ||   
                        ((Theta[nPointIdx]>=315)&&(Theta[nPointIdx]<360)))  
                    {  
                        g1 = M[nPointIdx-nWidth-1];  
                        g2 = M[nPointIdx-1];  
                        g3 = M[nPointIdx+1];  
                        g4 = M[nPointIdx+nWidth+1];  
                        dWeight = fabs(Q[nPointIdx])/fabs(P[nPointIdx]);   //正切  
                        dTmp1 = g2*dWeight+g1*(1-dWeight);  
                        dTmp2 = g4*dWeight+g3*(1-dWeight);  
                    }  
                    ////////////////////第三种情况///////////////////////  
                    /////////           g1  g2              /////////////  
                    /////////           C                   /////////////  
                    /////////       g4  g3                  /////////////  
                    /////////////////////////////////////////////////////  
                    else if( ((Theta[nPointIdx]>=45)&&(Theta[nPointIdx]<90)) ||   
                        ((Theta[nPointIdx]>=225)&&(Theta[nPointIdx]<270)))  
                    {  
                        g1 = M[nPointIdx-nWidth];  
                        g2 = M[nPointIdx-nWidth+1];  
                        g3 = M[nPointIdx+nWidth];  
                        g4 = M[nPointIdx+nWidth-1];  
                        dWeight = fabs(P[nPointIdx])/fabs(Q[nPointIdx]);   //反正切  
                        dTmp1 = g2*dWeight+g1*(1-dWeight);  
                        dTmp2 = g3*dWeight+g4*(1-dWeight);  
                    }  
                    ////////////////////第四种情况///////////////////////  
                    /////////               g1              /////////////  
                    /////////       g4  C   g2              /////////////  
                    /////////       g3                      /////////////  
                    /////////////////////////////////////////////////////  
                    else if( ((Theta[nPointIdx]>=0)&&(Theta[nPointIdx]<45)) ||   
                        ((Theta[nPointIdx]>=180)&&(Theta[nPointIdx]<225)))  
                    {  
                        g1 = M[nPointIdx-nWidth+1];  
                        g2 = M[nPointIdx+1];  
                        g3 = M[nPointIdx+nWidth-1];  
                        g4 = M[nPointIdx-1];  
                        dWeight = fabs(Q[nPointIdx])/fabs(P[nPointIdx]);   //正切  
                        dTmp1 = g1*dWeight+g2*(1-dWeight);  
                        dTmp2 = g3*dWeight+g4*(1-dWeight);  
                    }  
                }         
                //////////进行局部最大值判断,并写入检测结果////////////////  
                if((M[nPointIdx]>=dTmp1) && (M[nPointIdx]>=dTmp2))  
                    N[nPointIdx] = 128;  
                else  
                    N[nPointIdx] = 0;  
            }  
        }  
    }
    
    void doubleThresholdDetection(unsigned char* N,int* M,int nWidth,int nHeight)
    {
        //双阈值检测,最大的梯度幅值为360
        int nHist[1024];   
        int nEdgeNum;             //可能边界数  
        int nMaxMag = 0;          //最大梯度数  
        int nHighCount; 
        //统计直方图
        for(int i=0;i<1024;i++)  
            nHist[i] = 0;  
        for(int i=0; i<nHeight; i++)  
        {  
            for(int j=0; j<nWidth; j++)  
            {  
                if(N[i*nWidth+j]==128)  
                    nHist[M[i*nWidth+j]]++;  
            }  
        }  
        //获取最大幅值及潜在边缘个数
        nEdgeNum = nHist[0];  
        nMaxMag = 0;                    //获取最大的梯度值        
        for(int i=1; i<1024; i++)           //统计经过“非最大值抑制”后有多少像素  
        {  
            if(nHist[i] != 0)       //梯度为0的点是不可能为边界点的  
            {  
                nMaxMag = i;  
            }     
            nEdgeNum += nHist[i];   //经过non-maximum suppression后有多少像素  
        }  
        //这段代码的意思是,按照灰度值从低到高的顺序,选取前79%个灰度值中的最大的灰度值为高阈值,低阈值大约为高阈值的一半,这是根据经验数据的来的.
        double  dRatHigh = 0.79;  
        double  dThrHigh;  
        double  dThrLow;  
        double  dRatLow = 0.5;  
        nHighCount = (int)(dRatHigh * nEdgeNum + 0.5);  
        int j=1;  
        nEdgeNum = nHist[1];  
        while((j<(nMaxMag-1)) && (nEdgeNum < nHighCount))  
        {  
            j++;  
            nEdgeNum += nHist[j];  
        }  
        dThrHigh = j;                                   //高阈值  
        dThrLow = (int)((dThrHigh) * dRatLow + 0.5);    //低阈值 
        for(int i=0; i<nHeight; i++)  
        {  
            for(int j=0; j<nWidth; j++)  
            {  
                if((N[i*nWidth+j]==128) && (M[i*nWidth+j] >= dThrHigh))  
                {  
                    N[i*nWidth+j] = 255;  
                    TraceEdge(i, j, dThrLow, N, M, nWidth,nHeight);  
                }  
            }  
        }
    }
    
    void TraceEdge(int y, int x, int nThrLow, unsigned char* pResult, int *pMag, int nWidth,int nHeight)  
    {  
        //对8邻域像素进行查询  
        int xNum[8] = {1,1,0,-1,-1,-1,0,1};  
        int yNum[8] = {0,1,1,1,0,-1,-1,-1};  
            long yy,xx,k;  
        for(k=0;k<8;k++)  
        {  
            yy = y+yNum[k];  
            xx = x+xNum[k];  
            if(pResult[yy*nWidth+xx]==128 && pMag[yy*nWidth+xx]>=nThrLow )  
            {  
                //该点设为边界点  
                pResult[yy*nWidth+xx] = 255;  
                //以该点为中心再进行跟踪  
                TraceEdge(yy,xx,nThrLow,pResult,pMag,nWidth,nHeight);  
            }  
        }  
    }  
    

    3、高通滤波
    图像的边缘、细节主要是集中在高频部分,为了突出边缘,则采用高通滤波器让高频通过,而削弱低频部分,对条带状噪声的影像做去噪工作也是有奇效,但是,高通滤波容易产生振铃现象或者伪现象。
    常用滤波器有二维理想高通滤波器、巴特沃斯高通滤波器、指数高通滤波器、梯形高通滤波器。

    步骤:
    1、首先对一副图像进行如下二维傅里叶变换。
    这里写图片描述
    然后F[0,0]是直流分量
    这里写图片描述
    直流分量表示图像较为平滑没有太大变化的部分,其他为交流分量,所以理想的情况应该是保持直流分量而对其他部分进行增幅,但是滤波器是会衰减直流分量的,所以会产生振铃效应,导致图像盲恢复会产生图像信息的损失。
    2、然后选择高通滤波器,如
    二维理想高通滤波器:
    这里写图片描述
    D0是滤波器的阻带半径,而D(u,v)是点到滤波器中央的距离。理想高通的滤波器的振幅特性如下所示
    这里写图片描述
    巴特沃斯高通滤波器:
    这里写图片描述
    巴特沃斯高通滤波器也可以通过改变次数n,对过度特性进行调整。过大的n会造成振铃现象。
    这里写图片描述
    高斯高通滤波器
    这里写图片描述
    高斯滤波器的过度特性很好,所以不会发生振铃现象。
    这里写图片描述

    参考资料:
    https://www.cnblogs.com/fuhaots2009/p/3465149.html
    4、模板匹配
    模板匹配与图像分割交集比较少,目前看的基本是基于形状模型的图像分割,模板匹配对其有一定帮助,局限性挺大的。我同学的毕设老师说模板匹配太低级了,不给用哈哈哈哈
    模板匹配是一种最原始、最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配问题。它是图像处理中最基本、最常用的匹配方法。模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。
    在 OpenCV 中,提供了相应的函数完成这个操作。
    matchTemplate 函数:在模板和输入图像之间寻找匹配,获得匹配结果图像
    minMaxLoc 函数:在给定的矩阵中寻找最大和最小值,并给出它们的位置
    其中OpenCV 提供了 6 种计算两幅图像相似度的方法。
    差值平方和匹配 CV_TM_SQDIFF
    标准化差值平方和匹配 CV_TM_SQDIFF_NORMED
    相关匹配 CV_TM_CCORR
    标准相关匹配 CV_TM_CCORR_NORMED
    相关匹配 CV_TM_CCOEFF
    标准相关匹配 CV_TM_CCOEFF_NORMED
    具体方法公式可以参考以下链接。

    参考资料http://blog.csdn.net/zhi_neng_zhi_fu/article/details/51029864
    http://blog.csdn.net/liyuanbhu/article/details/49837661

    三、基于区域的图像分割
    1、区域生长法
    首先对每个需要分割的区域找出一个种子像素作为生长的七点,然后将种子像素周围邻域中与种子有相同或相似性质的像素(根据事先确定的生长或相似准则来确定)合并到种子像素所在的区域中。而新的像素继续作为种子向四周生长,直到再没有满足条件的像素可以包括进来,一个区域就生长而成了。
    这个方法有两个关键:一个是种子点怎么选,一个是阈值的限定。原理代码以前po过。
    http://blog.csdn.net/weixin_37051000/article/details/60142281
    2、分水岭算法
    这个怕是一时半会讲不清,地学领域很爱用。
    这里又发展出了多种面向对象的分割方法

    四、分割后处理
    1、数学形态学:膨胀、腐蚀、开运算、闭运算
    2、图像平滑、锐化

    展开全文
  • 图像分析则着重于构造图像的描述方法,更多地是用符号表示各种图像,而不是对图像本身进行运算,并利用各种有关知识进行推理 图像理解: 图像理解(image understanding,IU)就是对图像的语义理解。它是以图像为...

    写在前面:

    1. 图像处理主要研究图像传输、存储、增强和复原
    2. 计算机图形学主要研究点、线、面和体的表示方法以及视觉信息的显示方法
    3. 图像分析则着重于构造图像的描述方法,更多地是用符号表示各种图像,而不是对图像本身进行运算,并利用各种有关知识进行推理

    图像理解
    图像理解(image understanding,IU)就是对图像的语义理解。它是以图像为对象,知识为核心,研究图像中有什么目标、目标之间的相互关系、图像是什么场景以及如何应用场景的一门学科。
    图像理解属于数字图像处理的研究内容之一,属于高层操作。其重点是在图像分析的基础上进一步研究图像中各目标的性质及其相互关系,并得出对图像内容含义的理解以及对原来客观场景的解释,进而指导和规划行为。图像理解所操作的对象是从描述中抽象出来的符号,其处理过程和方法与人类的思维推理有许多相似之处。
    图像分析
    图像分析一般利用数学模型并结合图像处理的技术来分析底层特征和上层结构,从而提取具有一定智能性的信息。
    图像处理
    图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。基本内容 图像处理一般指数字图像处理。数字图像是指用数字摄像机、扫描仪等设备经过采样和数字化得到的一个大的二维数组,该数组的元素称为像素,其值为一整数,称为灰度值。图像处理技术的主要内容包括图像压缩,增强和复原,匹配、描述和识别3个部分。 常见的处理有图像数字化、图像编码、图像增强、图像复原、图像分割和图像分析等。图像处理一般指数字图像处理。
    三者关系:
    用模式识别和人工智能方法对物景进行分析、描述、分类和解释的技术,又称景物分析或图像理解。20世纪60年代以来,在图像分析方面已有许多研究成果,从针对具体问题和应用的图像分析技术逐渐向建立一般理论的方向发展。图像分析同图像处理、计算机图形学等研究内容密切相关,而且相互交叉重叠。但图像处理主要研究图像传输、存储、增强和复原;计算机图形学主要研究点、线、面和体的表示方法以及视觉信息的显示方法;图像分析则着重于构造图像的描述方法,更多地是用符号表示各种图像,而不是对图像本身进行运算,并利用各种有关知识进行推理。图像分析与关于人的视觉的研究也有密切关系,对人的视觉机制中的某些可辨认模块的研究可促进计算机视觉能力的提高(见机器视觉)。
    图像分析(image analysis)和图像处理(image processing)关系密切,两者有一定程度的交叉,但是又有所不同。图像处理侧重于信号处理方面的研究,比如图像对比度的调节、图像编码、去噪以及各种滤波的研究。但是图像分析更侧重点在于研究图像的内容,包括但不局限于使用图像处理的各种技术,它更倾向于对图像内容的分析、解释和识别。因而,图像分析和计算机科学领域中的模式识别、计算机视觉关系更密切一些。
    图像分析一般利用数学模型并结合图像处理的技术来分析底层特征和上层结构,从而提取具有一定智能性的信息。
    注意:图形不等同于图像,图形只表达了视觉,图像表达了视觉与知觉。目前研究热点:图像检索、三维重建、复原、高分辨率的计算与压缩。

    参考文献:
    1.http://blog.sina.com.cn/s/blog_4cc6b2a2010008bu.html
    2.https://blog.csdn.net/eric41050808/article/details/48996815?locationNum=14

    展开全文
  • 图像处理 图像分析和图像理解

    万次阅读 2018-06-11 13:22:11
    图像分析:对图像中感兴趣的目标进行检测和测量,以获得他们的客观信息,从而建立对图像的描述。图像理解:重点是在图像分析的基础上,进一步研究图像中各目标的性质和它们之间的相互联系,并...



    图像处理:利用计算机对图像进行去除噪声、增强、复原、分割、特征提取、识别、等处理的理论、方法和技术。狭义的图像处理主要是对图像进行各种加工,以改变图像的视觉效果并为自动识别奠定基础,或对图像进行压缩编码以减少所需存储空间。

    图像分析:对图像中感兴趣的目标进行检测和测量,以获得他们的客观信息,从而建立对图像的描述。

    图像理解:重点是在图像分析的基础上,进一步研究图像中各目标的性质和它们之间的相互联系,并得出对图像内容含义的理解以及对原来客观场景的解释,从而指导和规划行动。

    三者之间的联系:图像处理是比较低层的操作,它主要在图像像素级上进行处理,处理的数据量非常大。图像分析则进入了中层,分割和特征提取把原来以像素描述的图像转变成比较简洁的非图形式的描述。图像理解主要是高层操作,基本上式对从描述抽象出来的符号进行运算,其处理过程和方法与人类的思维推理有许多类似之处。

    展开全文
  •  PCA(PrincipalComponents Analysis)即主成分分析,是图像处理中经常用到的降维方法,大家知道,我们在处理有关数字图像处理方面的问题时,比如经常用的图像的查询问题,在一个几万或者几百万甚至更大的数据库中...
  • 图像处理常用算法总结

    万次阅读 2015-12-02 21:26:41
    5、图像分割(灰度、颜色、频谱特征、纹理特征、空间特征) 6、变换(空域和频域、几何变换、色度变换) 7、几何形态分析(Blob分析) (形状、大小、长度、面积、边缘、圆形度位置、方向、数量、连通性等) 8、匹配...
  • 6本值得收藏的数字图像处理书籍!

    万次阅读 2016-11-01 10:32:17
    在这个看脸的时代,颜值... 随着台式计算机的处理能力日益增强,各种图像拍摄的设备(例如平板电脑、手机摄像头、数码相机、扫描仪等)的普及,以及互联网的加持,使得数字图像处理变得文字处理一样普及。本书就数字
  • 图像处理之预处理方法概述

    万次阅读 2017-12-18 21:00:58
    图像分析中,图像质量的好坏直接影响识别算法的设计效果的精度,因此在图像分析(特征提取、分割、匹配和识别等)前,需要进行预处理。图像预处理的主要目的是消除图像中无关的信息,恢复有用的真实信息,增强有关...
  • 图像理解:  图像理解(image understanding,IU)就是对图像的语义理解。...其重点是在图像分析的基础上进一步研究图像中各目标的性质及其相互关系,并得出对图像内容含义的理解以及对原来客观场景的解释,进
  • 本篇文章主要叙述图像分析处理,至于视频,实际上视频本身就是一个大文件,hadoop对于大文件处理是高效的,所以在MapReduce的处理上需要使用ffmepg将视频切割为图像后再将图像转换为javacv可识别的流数据即可。...
  • 二者可以通过傅里叶变换相互转化,因为在频率域就是一些特性比较突出,容易处理。比如在空间图像里不好找出噪声的模式,如果变换到频率域,则比较好找出噪声的模式,并能更容易的处理。 具体名词解释如下: 空间域 ...
  • 图像处理中,我们会频繁用到这三个概念,这里整理了网上优秀的博客。供大家交流学习。 一、什么是时域  时域是描述数学函数或物理信号对时间的关系。例如一个信号的时域波形可以表达信号随着时间的变化。 ...
  • 高通滤波:边缘提取增强低通滤波:边缘平滑边缘区域的灰度变换加大,也就是频率较高。所以,对于高通滤波,边缘部分将被保留,非边缘部分将被过滤;对于低通滤波,边缘区域将被平滑过渡。
  • 计算机图像处理技术入门(一)

    万次阅读 2006-05-19 10:06:00
    图像处理简介 计算机数字图像处理(简称图像处理)起源于60年代中期,美国NASA用计算机技术处理卫星传回的图像信息。... 在图像处理领域,对图像的基本操作是图像变换和图像分析。前者用某种方式改变图像,
  • 数字图像处理的三个层次

    万次阅读 2017-01-02 11:56:45
    数字图像处理分为三个层次:低级图像处理、中级图像处理和高级图像处理。 (1)低级图像处理内容 内容:主要对图象进行各种加工以改善图象的视觉效果、或突出有用信息,并为自动识别打基础,或通过编码以减少对其所...
  • 近年来,国内做计算机视觉、模式识别、图像处理、智能视频分析、智能交通的公司和机构是越来越多,应用面也越来越广。 以下是我个人整理的一些国内CVPR和图像处理领域中还不错的大公司和研究机构。对于想从事...
  • 图像处理算法工程师

    万次阅读 2017-09-11 15:09:04
    整理了一下网上各个公司图像处理算法工程师的招聘要求:  图像处理算法工程师 职位要求 编程技能: 1、 具有较强的编程能力和良好的编程习惯, 精通c/c++编程,并熟练使用VS 或matlab开发环境; 2、 在计算机...
  • 数字图像处理与机器视觉PDF

    千次阅读 热门讨论 2018-10-23 13:04:57
    链接:https://pan.baidu.com/s/13buF4X2_O6c-xNPz8tM_ng  提取码:r2lk
  • 图像的空域和频域

    千次阅读 2018-08-24 21:28:20
    换一个角度,如果将f(x,y)视为幅值变化的二维信号,则可以通过某些变换手段(如傅里叶变换、离散余弦变换、沃尔什变换和小波变换等)在频域下对图像进行处理了 因为在频率域就是一些特性比较突出,容易处理。...
1 2 3 4 5 ... 20
收藏数 224,416
精华内容 89,766
关键字:

图像分析与处理