opencv提高图像处理_vs2015 opencv 加载图像 处理图像 - CSDN
  • 本文主要通过OpenCV实现一些基础的图像处理过程,包括直方图均衡化、拉普拉斯算子图像增强、Gamma校正过程。 图像的对比度:灰度的动态范围来衡量。 一、直方图均衡化 直方图均衡化是通过调整图像的灰阶分布,使得在...
    本文主要通过OpenCV实现一些基础的图像处理过程,包括直方图均衡化、拉普拉斯算子图像增强、Gamma校正过程。
    图像的对比度:灰度的动态范围来衡量。
    一、直方图均衡化
    直方图均衡化是通过调整图像的灰阶分布,使得在0~255灰阶上的分布更加均衡,提高了图像的对比度,达到改善图像主观视觉效果的目的。对比度较低的图像适合使用直方图均衡化方法来增强图像细节。

    实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等。这样,原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较平的分段直方图:如果输出数据分段值较小的话,会产生粗略分类的视觉效果。

    直方图是表示数字图像中每一灰度出现频率的统计关系。

    直方图能给出图像灰度范围、每个灰度的频度和灰度的分布、整幅图像的平均明暗和对比度等概貌性描述。

    灰度直方图是灰度级的函数, 反映的是图像中具有该灰度级像素的个数,其横坐标是灰度级r, 纵坐标是该灰度级出现的频率( 即像素的个数) pr( r) , 

    整个坐标系描述的是图像灰度级的分布情况,由此可以看出图像的灰度分布特性, 

    即若大部分像素集中在低灰度区域, 图像呈现暗的特性; 若像素集中在高灰度区域, 图像呈现亮的特性。

    图1所示就是直方图均衡化, 即将随机分布的图像直方图修改成均匀分布的直方图。

    基本思想是对原始图像的像素灰度做某种映射变换, 使变换后图像灰度的概率密度呈均匀分布。

    这就意味着图像灰度的动态范围得到了增加, 提高了图像的对比度。

    clip_image001

    图1 直方图均衡化

    彩色lena图像的直方图均衡化实现:

    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <iostream>
    
    using namespace cv;
    
    int main(int argc, const char * argv[])
    {
        Mat image = imread("/Users/shandiangou/Downloads/lena.png");
        Mat gray;
        if(image.empty())
        {
            std::cout <<"图片打开失败"<<std::endl;
            return -1;
        }
        imshow("lena原图",image);
        waitKey();
        
        cvtColor(image, gray, CV_RGB2GRAY);
        int bins = 256;
        int hist_size[] = {bins};
        float range[] = {0,256};
        const float * ranges[] ={range};
        MatND hist;
        int channels[] = {0};
        
        calcHist(&gray, 1, channels, Mat(), hist, 1, hist_size, ranges, true, false);
        double max_val;
        minMaxLoc(hist, 0,&max_val, 0,0);
        int scale = 2;
        int hist_height =256;
        Mat hist_img = Mat::zeros(hist_height, bins*scale, CV_8UC3);
        for(int i=1;i<bins;i++)
        {
            float bin_val = hist.at<float>(i);
            int intensity = cvRound(bin_val*hist_height/max_val);
            rectangle(hist_img, Point(i*scale, hist_height-1), Point((i+1)*scale-1, hist_height-intensity), CV_RGB(255,255,255));
        }
        imshow("原图灰度直方图",hist_img);
        waitKey();
            
        Mat gray1, imageRGB[3];
        split(image, imageRGB);
        for (int i =0;i<3;i++)
        {equalizeHist(imageRGB[i],imageRGB[i]);
        }
        merge(imageRGB, 3, image);
        imshow("直方图均衡化后lena",image);
        waitKey();
        
        cvtColor(image, gray1, CV_RGB2GRAY);
        calcHist(&gray1, 1, channels, Mat(), hist, 1, hist_size, ranges, true, false);
        minMaxLoc(hist, 0,&max_val, 0,0);
        for(int i=1;i<bins;i++)
        {
            float bin_val = hist.at<float>(i);
            int intensity = cvRound(bin_val*hist_height/max_val);
            rectangle(hist_img, Point(i*scale, hist_height-1), Point((i+1)*scale-1, hist_height-intensity), CV_RGB(255,255,255));
        }
        imshow("均衡后灰度直方图",hist_img);
        waitKey();
        
        return 0;
    }

    结果图分别是原图、原图的灰度直方图、直方图均衡化后图、直方图均衡化后图的灰度直方图;可以清楚的看到直方图均衡的效果。



    二、基于拉普拉斯算子的图像增强;

    使用中心为5的8邻域拉普拉斯算子与图像卷积可以达到锐化增强图像的目的,拉普拉斯算子如下图所示:
          
      

    拉普拉斯算子可以增强局部的图像对比度:
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <iostream>
    
    using namespace cv;
    
    int main(int argc, char *argv[])
    {
        Mat image = imread("/Users/shandiangou/Downloads/lena.png");
        if (image.empty())
        {
            std::cout << "打开图片失败,请检查" << std::endl;
            return -1;
        }
        imshow("原图像", image);
        waitKey();
        Mat imageEnhance;
        Mat kernel = (Mat_<float>(3, 3) << 0, -1, 0, 0, 5, 0, 0, -1, 0);
        filter2D(image, imageEnhance, CV_8UC3, kernel);
        imshow("拉普拉斯算子图像增强效果", imageEnhance);
        waitKey();
        return 0;
    }




    三、Gamma校正

    伽马变换主要用于图像的校正,将灰度过高或者灰度过低的图片进行修正,增强对比度。变换公式就是对原图像上每一个像素值做乘积运算:



    伽马变换对图像的修正作用其实就是通过增强低灰度或高灰度的细节实现的,从伽马曲线可以直观理解:



    γ值以1为分界,值越小,对图像低灰度部分的扩展作用就越强,值越大,对图像高灰度部分的扩展作用就越强,通过不同的γ值,就可以达到增强低灰度或高灰度部分细节的作用。

    伽马变换对于图像对比度偏低,并且整体亮度值偏高(对于于相机过曝)情况下的图像增强效果明显,此时gamma值>1。

    #include <opencv2/core/core.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <opencv2/highgui/highgui.hpp>
    
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    
    // Normalizes a given image into a value range between 0 and 255.
    Mat norm_0_255(const Mat& src) {
        // Create and return normalized image:
        Mat dst;
        switch(src.channels()) {
            case 1:
                cv::normalize(src, dst, 0, 255, NORM_MINMAX, CV_8UC1);
                break;
            case 3:
                cv::normalize(src, dst, 0, 255, NORM_MINMAX, CV_8UC3);
                break;
            default:
                src.copyTo(dst);
                break;
        }
        return dst;
    }
    
    int main(int argc, const char *argv[]) {
        // Get filename to the source image:
        // Load image & get skin proportions:
        Mat image = imread("/Users/shandiangou/Downloads/guobao.jpeg");
        // Convert to floating point:
        Mat X;
        image.convertTo(X, CV_32FC1);
        //image.convertTo(X, CV_32F);
        // Start preprocessing:
        Mat I;
        float gamma = 3;
        pow(X, gamma, I);
        
        
        // Draw it on screen:
        imshow("Original Image", image);
        waitKey();
        imshow("Gamma correction image", norm_0_255(I));
        // Show the images:
        waitKey();
        // Success!
        return 0;  
    }

    特地找了张过曝图片 进行处理,增强该图的对比度。


    展开全文
  • 使用GPU提高OpenCV图像处理运算速度OpenCV中提供了GPU模块,可以用来加速图像处理的相关运算。OpenCV的GPU模块是使用CUDA编写的。OpenCV中GPU模块的调用点击这里,使用GPU模块需要开启WITH_CUDA选项。OpenCV官方...

    OpenCV中提供了GPU模块,可以用来加速图像处理的相关运算。OpenCV的GPU模块是使用CUDA编写的。

    OpenCV中GPU模块的调用点击这里,使用GPU模块需要开启WITH_CUDA选项。

    OpenCV官方关于CUDA的说明及范例点击这里

    关于如何在实时图像处理中使用OpenCV与GPU可以参考这篇文章


    展开全文
  • 图像处理学习中会涉及到直方图,直方图很好地表现了图像的灰度信息;同时我们注意到在暗图像中,直方图的分量集中在灰度级的低端;亮图像的灰度值集中在直方图灰度值的高端;低对比度的图像有较窄的直方图,并集中...

    在图像处理学习中会涉及到直方图,直方图很好地表现了图像的灰度信息;同时我们注意到在暗图像中,直方图的分量集中在灰度级的低端;亮图像的灰度值集中在直方图灰度值的高端;低对比度的图像有较窄的直方图,并集中于直方图的中间部分;高对比度的图像中直方图的分量覆盖很宽的范围,而且像素的分布没有太不均匀,只能看到少量垂线比其他高许多。通过图像增强可以有效地减弱这些缺陷
    人真皮成纤维细胞

                                图 1
    

    人脸

                               图   2
    

    如图1,细胞表面的一些地方较为模糊,图2,整体图片偏亮
    来看先来看第一张图的直方分布图:
    这里写图片描述
    分量集中在灰度值较高地地方。
    第二张图的直方分布图:
    这里写图片描述
    直方图

    来看一下两张图片的直方分布图片:

    下面两张是经图像增强处理图片:
    处理后的细胞图片

                                  图 3
    

    可以明显看到图片比之前的要清晰;
    再来看其直方分布图:
    这里写图片描述

    处理后的人像
    图 4
    人脸的直方分布图:
    这里写图片描述
    首先,我们设连续的灰度r和z,同时令Pr(r)Pz(z)表示其连续的概率密度函数。

    Pr(r)
    为原来图像的灰度概率函数,Pz(z)为经处理后的概率函数:
    同时我们设一个随机变量s:
    s=T(r)=(L1)r0Pr(w)dw
    其中w为积分变量;
    接着定义随机变量z:
    G(z)=(L1)z0Pz(t)dt=s
    其中t为积分变量;
    由这两个公式可得G(z)=T(r)
    z=G1[T(r)]=G1(s)
    当输入函数Pr(r)时,变换函数T(r)可得到s;同时,Pz(z)可经过G(z)变换得到s,同时得到
    z=G1[T(r)]=G1[(L1)r0Pr(w)dw]
    在实际中图像的直方图灰度分量是离散的,处理离散量时,只求得到一个近似的直方图:
    sk=T(rk)=(L1)kj=0Pr(rj)=L1MNkj=0nj,k=0,1,2,3,,L1
    其中MN是图像总的像素点,nj是具有灰度值rj的像素的个数,L是图像中可能的灰度级数;
    接下来上代码:
    #include<opencv2\opencv.hpp>
    #include<opencv\cv.h>
    #include<opencv2\core\core.hpp>
    #include<stdlib.h>
    #include<math.h>
    
    using namespace cv;
    using namespace std;
    
    void  enhance(Mat src, Mat dir)
    {    
        FILE *fp;
        fp = fopen("src.txt", "w");
        int srcpixel[256] = { 0 };
        int dirpixel[256] = { 0 };
        int p;//temp
        double srcprob[256];
        double dirprob[256] = {0};
        double zhong = src.rows*src.cols;
        for (int i = 0; i < src.rows; i++)
        {
            for (int j = 0; j < src.cols; j++)
            {
    
                p = src.at<uchar>(i, j);
                srcpixel[p]++;
            }
        }
        for (int i = 0; i < 255; i++)
        {
            srcprob[i] = srcpixel[i]/ zhong;
            fprintf(fp, "%lf  ", srcprob[i]);
            printf("srcpixel[%d]=%f\n", i, srcprob[i]);
        }
        double o=0;
        dirprob[0] = srcprob[0];
        for (int i = 1; i < 256; i++)
        {
            dirprob[i] = dirprob[i - 1] + srcprob[i];
        }
        for (int i = 0; i < src.rows; i++)
        {
            for (int j = 0; j < src.cols; j++)
            {
                p = src.at<uchar>(i, j);
                dir.at<uchar>(i, j) = 255 * dirprob[p];
            }
        }
        fclose(fp);
    //  srcpixel[256] = { 0 };
    
        fp = fopen("dir.txt", "w");
        for (int i = 0; i < src.rows; i++)
        {
            for (int j = 0; j < src.cols; j++)
            {
    
                p = dir.at<uchar>(i, j);
                dirpixel[p]++;
            }
        }
        for (int i = 0; i < 255; i++)
        {
            srcprob[i] =dirpixel[i] / zhong;
            fprintf(fp, "%lf  ", srcprob[i]);
            printf("srcpixel[%d]=%f\n", i, srcprob[i]);
        }
        fclose(fp);
    
    
    
    }
    int main(int argc,char *argv[])
    {
    
        Mat src= imread("3.jpg",0);
        Mat dir(src.rows,src.cols,CV_8UC1);
        imshow("src", src);
        //cvtColor(pic, pic, CV_BGR2GRAY);
        //imshow("12", pic);
        enhance(src, dir);
        imshow("drt", dir);
        imwrite("22.jpg", dir);
        waitKey();
    }

    这里 src,dir表示原来图像和目标图像,先遍历出各灰度值的像素个数,计算出概率prob,通过公式转化成目标图像的概率
    fprintf将灰度值概率记下,方便用openGL或excel画出直方图进行比对

    笔者能力有限,如有不足或错误欢迎指出

    展开全文
  • 检测是计算机视觉任务中的主要任务之一,而且应用很广泛。... 理解颜色模型与在图像上绘制图形(图像处理基本操作)。 基本的图像处理与滤波技术。 从特征检测到人脸检测。 轮廓检测...

    640?wx_fmt=jpeg

    检测是计算机视觉任务中的主要任务之一,而且应用很广泛。检测技术可以帮助人类检测那些容易被肉眼忽略的错误;也可以”帮助“自动驾驶汽车感知空间信息。无疑自动化的检测技术的广泛应用将为我们带来效率与安全。

    本篇是这个系列的第三篇。整个系列目录如下:

    1. 理解颜色模型与在图像上绘制图形(图像处理基本操作)。

    2. 基本的图像处理与滤波技术。

    3. 从特征检测到人脸检测。

    4. 轮廓检测

    之前已经介绍了几种颜色模型以及如何在图像上绘制图形。还介绍了常用的图像处理技术,如:模糊、梯度、腐蚀、扩张等。本篇将把这些技术应用到图像特征检测和人脸检测中。

    本篇会用到本系列前两篇中介绍的图像处理技术。

    边缘检测 (Edge Detection)

    边缘检测本质上是检测图像中变化剧烈或者不连续的像素点。将这些像素点连接线段即为边。实际上,在上一篇文章中我们已经介绍了一种基础的边缘检测技术:使用Sobel算子和拉普拉斯算子进行梯度滤波。通过计算图像像素值在给定方向上的导数,梯度滤波器即可以描绘出图像的边缘从而实现边缘检测。

    Canny检测算法是另外一种图像边缘检测技术。而且是目前最流行的边缘检测技术之一,分为以下四个步骤实现:降噪、判断梯度及梯度方向、非最大值抑制和滞后阈值化处理。

    首先通过高斯模糊技术实现降噪。然后,使用sobel算子得到图像梯度。接着使用得到的梯度,检测每一个像素点与其中周围的像素点,确认这个像素点是不是这些局部像素点中的局部最大值。如果不是局部最大值,则将这个点的像素值置为零(完全缺失,黑色)。这个过程即为非极大值抑制

    640?wx_fmt=png

    如果这个点被确认为局部最大值,则进行下一步即第四个步骤。第四步是决定之前检测出的边是否为真正边缘的最后一个决策阶段。这一决策阶段被称为滞后阈值化,它需要两个阈值(“较小阈值”、“较大阈值”)来进行决策。

    给定两个不同的阈值,我们可以得到三个阈值化区间。因此,如果这个点的像素值大于两个阈值中的“较大阈值”则被判定为边缘点。相对地,如果其小于所设定的两个阈值参数中的“较小阈值”则被认定为非边缘点,即会被丢弃。另外,如果这个点的像素值位于两个参数阈值之间则是跟据其是否与”确认边缘点“之间有连接来决定是否丢弃,遵循有连接则不丢弃的原则。

    img = cv2.imread('images/giraffe.jpg')
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    # Canny detection without blurring
    edges = cv2.Canny(image=img, threshold1=127, threshold2=127)
    plt.figure(figsize = (2020))
    plt.subplot(121); plt.imshow(img)
    plt.axis('off')
    plt.subplot(122); plt.imshow(edges)
    plt.axis('off')
    

    640?wx_fmt=png


    上方仅使用了一个阈值中值作判断,也没有进行图像模糊处理,边缘检测结果不是很理想。接下来让我们尝试不同的参数阈值设定:

     

    # Set the lower and upper threshold
    med_val = np.median(img)
    lower = int(max(0.7*med_val))
    upper = int(min(2551.3*med_val))
    

    为了更直观的比较模糊化对图像边缘检测的影响,将使用两种不同尺寸的卷积核(5x5)与(9x9)。设定两种阈值参数,一种在上述阈值设定的基础上将“较大阈值”增加100。也就意味着我们会得到四种不同的组合结果图。如下:

    # Blurring with ksize = 5 
    img_k5 = cv2.blur(img, ksize = (55))
    # Canny detection with different thresholds
    edges_k5 = cv2.Canny(img_k5, threshold1 = lower, threshold2 = upper)
    edges_k5_2 = cv2.Canny(img_k5, lower, upper+100)
    # Blurring with ksize = 9 
    img_k9 = cv2.blur(img, ksize = (99))
    # Canny detection with different thresholds
    edges_k9 = cv2.Canny(img_k9, lower, upper)
    edges_k9_2 = cv2.Canny(img_k9, lower, upper+100)
    # Plot the images
    images = [edges_k5, edges_k5_2, edges_k9, edges_k9_2]
    plt.figure(figsize = (2015))
    for i in range(4):
        plt.subplot(22, i+1)
        plt.imshow(images[i])
        plt.axis('off')
    plt.show()
    

    640?wx_fmt=png

    正如上图所示,模糊化可以帮助减少噪声。我们在使用卷积核尺寸为(9x9)时得到了更好的结果。而且,在使用更大的“较大阈值”时得到了更好的边缘检测结果。

    角点检测(Corner Detection)

    角点检测是另一种广泛应用于目标检测、运动检测、视频目标追踪等领域的检测算法。图像处理中的角是什么?应该如何定义?在这里,我们把角看作是边相交的连接点。那我们怎么才能找到他们呢? 你可能会想到一个最基础的方式是先找到所有的边,然后找到它们相交的点。但实际上,还有另一种更高效的方法确认角点提高效率的方法,即Harris角点检测Shi&Tomasi角点检测。接下来让我们来详细了解这两种算法。

    这两种算法的工作原理如下。首先,检测出各个方向上像素强度值有很大变化的点。然后构造一个矩阵,从中提取特征值。通过这些特征值进行评分从而决定它是否是一个角。数学表达式如下所示。

    640?wx_fmt=png

    现在让我们看看它们的代码实现。首先,需要把图片转换为灰度图。Harris角点检测可以通过OpenCV中的cv2.cornerHarris()函数实现。

    img = cv2.imread('images/desk.jpg')
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    # Apply Harris corner detection
    dst = cv2.cornerHarris(img_gray, blockSize = 2, ksize = 3, k = .04)
    

    参数blocksize是指定领域窗口设定的大小,k是Harris检测的自由参数对应上方公式中的k值。输出结构为得分R,我们将使用R得分检测角点。

    # Spot the detected corners
    img_2 = img.copy()
    img_2[dst>0.01*dst.max()]=[255,0,0]
    # Plot the image
    plt.figure(figsize = (2020))
    plt.subplot(121); plt.imshow(img)
    plt.axis('off')
    plt.subplot(122); plt.imshow(img_2)
    plt.axis('off')
    

    640?wx_fmt=png

    下方是Shi-Tomasi角点检测的代码实现。使用函数cv2.goodFeaturesToTrack()实现。通过maxCorners参数指定最大角点个数。相应地,通过minDistance指定角点间的最小距离和角点评定的最小质量级别。得到检测到的角点后,使用圆圈标记这些角点,如下所示:

    # Apply Shi-Tomasi corner detection
    corners = cv2.goodFeaturesToTrack(img_gray, maxCorners = 50, 
                                      qualityLevel = 0.01, 
                                      minDistance = 10)
    corners = np.int0(corners)
    # Spot the detected corners
    img_2 = img.copy()
    for i in corners:
        x,y = i.ravel()
        cv2.circle(img_2, center = (x, y), 
                   radius = 5, color = 255, thickness = -1)
    # Plot the image
    plt.figure(figsize = (2020))
    plt.subplot(121); plt.imshow(img)
    plt.axis('off')
    plt.subplot(122); plt.imshow(img_2)
    plt.axis('off')
    

    640?wx_fmt=png

    001 (9)

    人脸检测

    人脸检测是一种识别图像中是否存在人脸以及人脸的位置的技术。人脸检测不同于人脸识别,人脸识别是通过一个人的脸来识别这个人。 所以人脸检测并不能告诉我们这个人脸是属于谁。

    人脸检测本质上是一项分类任务,训练其分类物体是否存在来从而实现检测。基于Haar特征的级联分类器是OpenCV中常用的人脸检测模型之一。它已经在数千副图像上进行过预训练。理解该算法的四个关键点分别是:Haar特征提取、积分图像、Adaboost和级联分类器。

    640?wx_fmt=png

    类haar特征(Haar-like features)是用于目标检测的数字图像特征,示例如上图。Haar特征这个名字来源于其与Harr小波的直观相似性,且Haar小波最初是由Alfred Haar提出的。在检测过程中,通过滑动窗口和滤波器上的卷积操作来确认这些特征是不是我们所需要的特征。如下方所示:

    640?wx_fmt=png

    那么,我们具体如何来确定给定区域是否含有需要的特征呢? 如上方图片中所示。使用一个特定卷积核(上半区域是暗的,下半区域是亮的)得到每个区域像素值的平均值,并减去两者之间的差距。如果结果高于阈值(比如0.5),则可得出结果,其就是我们正在检测的特征。对每个内核重复这个过程,同时在图像上滑动窗口。

    虽然这个计算过程并不复杂,但如果在正个图像重复这个过程计算量还是很大的。这也是积分图像要解决的主要问题。积分图像是一种图像表示方式,它是为了提高特征估计的速度与效率而衍生出来的。

    如下图所示,左边是原始图像的像素值,右边是积分图像的像素值。从左上角开始计算给定矩形区域下像素的累加值。在积分图像上,将虚线框像素值的累加和填充在右边框的右下角处。

    640?wx_fmt=png

    使用上方这个“预计算表”,我们可以通过子矩形(上图中红色、橙色、蓝色和紫色框)的值方便地得到某个区域的像素值总和。

    所以积分图像可以帮助我们在一定程度上解决计算量过大的问题。但还不够,还存在着计算量优化的空间。当检测窗口位于没有目标或人脸的空白背景时,执行检测则会耗费不必要的计算量。这时就可以通过使用Adaboost和级联分类器,从而实现计算量进一步优化。

    640?wx_fmt=png

    上图展示了级联分类器逐步构造的各个阶段,并对类haar特征进行排序。基本特征会在早期阶段被识别出来,后期只识别有希望成为目标特征的复杂特征。在每一个阶段,Adaboost模型都将由集成弱分类器进行训练。如果子部件或子窗口在前一阶段被分类为“不像人脸的区域”,则将被拒绝进入下一步。通过上述操作,只须考虑上一阶段筛选出来的特征,从而实现更高的速度。

    我们的英雄在哪?

    接下来让我们使用上述级联分类器实现漫威英雄面部检测--惊奇队长面部检测。

    640?wx_fmt=png

    001 (15)

    我们只须使用图像中的一部分即头部部分。首先,获取惊奇队长脸部周围感兴趣区域;然后把图像转换成灰度图。之所以只使用一个通道,是因为我们只对特征的像素值强度变化感兴趣。

    cap_mavl = cv2.imread('images/captin_marvel.jpg')
    # Find the region of interest
    roi = cap_mavl[50:350200:550]
    roi = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
    plt.imshow(roi, cmap = 'gray')
    

    640?wx_fmt=png

    通过下方代码使用Haar级联分类器。

    # Load Cascade filter 
    face_cascade = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')
    

    接下来,我们将创建一个函数来检测人脸并在目标区域周围绘制一个矩形。为了检测人脸,我们可以使用上面加载的分类器face_cascade的. detectmulitscale()方法。它返回指定区域的四个点所以我们在那个位置画一个矩形。scaleFactor是一个参数,表示在每个图像尺度上图像大小减少了多少,minNeighbors表示每个候选矩形应该训练多少个邻居。现在我们把这个函数应用到图像上,看看结果。

    # Create the face detecting function 
    def detect_face(img):
    
        img_2 = img.copy()
        face_rects = face_cascade.detectMultiScale(img_copy, 
                                                   scaleFactor = 1.1,
                                                   minNeighbors = 3)
    
        for (x, y, w, h) in face_rects:
            cv2.rectangle(img_2, (x, y), (x+w, y+h), (255255255), 3)
    
        return img_2
    # Detect the face
    roi_detected = detect_face(roi)
    plt.imshow(roi_detected, cmap = 'gray')
    plt.axis('off')
    

    640?wx_fmt=png

    正如看到的那样,haar级联分类器取得了不错的人脸检测效果。接下来,让我们尝试检测含有多张人脸的图片。

    # Load the image file and convert the color mode
    avengers = cv2.imread('images/avengers.jpg')
    avengers = cv2.cvtColor(avengers, cv2.COLOR_BGR2GRAY)
    # Detect the face and plot the result
    detected_avengers = detect_face(avengers)
    display(detected_avengers, cmap = 'gray')
    

    640?wx_fmt=png

    很明显检测结果不完全准确。出现了错误捕捉“非人脸”目标以及丢失了部分“真实人脸”。有趣的是,它成功地探测到了蜘蛛侠,却把美国队长和黑寡妇的手误当成了眼睛。通常在人脸图像凸显出更加清晰的五官时,可以得到更好的人脸检测结果。

    尝试检测自己的脸

    接下来介绍使用网络摄像头检测人脸的实现方法。类似上方的实现方式。代码如下方所示。可以通过ESC按键终止退出检测。

    import cv2
    import numpy as np
    
    # Step 1. Define detect function
    face_cascade = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')
    
    def detect_face(img):
    
        img_copy = img.copy()
        face_rects = face_cascade.detectMultiScale(img_copy)
    
        for (x, y, w, h) in face_rects:
            cv2.rectangle(img_copy, (x, y), (x+w, y+h), (255255255), 3)
    
        return img_copy
    
    # Step 2. Call the cam
    cap = cv2.VideoCapture(0while True: 
    
        ret, frame = cap.read(0) 
    
        frame = detect_face(frame)
        cv2.imshow('Video Face Detection', frame) 
    
        c = cv2.waitKey(1) 
        if c == 27: 
            break 
    
    cap.release() 
    cv2.destroyAllWindows()
    

    总结

    本篇介绍了传统的边缘检测、角点检测以及人脸检测方法。下篇将介绍轮廓检测技术等。敬请期待。

     

     

    欢迎关注磐创博客资源汇总站:
    http://docs.panchuang.net/

    欢迎关注PyTorch官方中文教程站:
    http://pytorch.panchuang.net/

    展开全文
  • 通过OpenCV,制作一个有关图像处理的在Linux下的软件。 制作可以自动处理图像亮度的简单软件。 算法思想就是给每个像素加上一个固定的值来改变亮度。但是对于不同的图片效果就不是很好,最好是把代码中两行解注释...
  • javaCV图像处理系列: 一、javaCV图像处理之1:实时视频添加文字水印并截取视频...三、opencv图像处理3:使用opencv原生方法遍历摄像头设备及调用(方便多摄像头遍历及调用,相比javacv更快的摄像头读取速度和效...
  • 项目... import org.opencv.core.*; import org.opencv.highgui.HighGui; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; import java.io...
  • 嵌入式ARM及ARM-Linux操作系统已广泛应用于工业控制、通信、医疗仪器等各个领域。ARM设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如...
  • 很早之前(2018年左右)在做一个当时风靡一时"跳一跳"小游戏的自动运行小工具时(树莓派通过摄像头获取手机屏幕图像,再驱动舵机云台去点击手机屏幕),就有发现树莓派在做图像处理时,OpenCV连续从摄像头获取的图像和...
  • Java OpenCV-4.0.0 图像处理09 图像混合以及亮度与对比度操作 Java OpenCV-4.0.0 图像混合以及亮度与对比度操作 图像混合 g(x)=(1-α) f_0 (x)+αf_1 (x) α(0~1) 图像亮度与对比度 g(i,j)=αf(i,j)+β其中α&...
  • import cv2 #opencv读取的格式是BGR import matplotlib.pyplot as plt 导入需要的包 img=cv2.imread('img005.jpg') img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) 读入图片,并把图片转为rgb格式,因为matplotlib...
  • 基本图像处理 1、 运行环境、语言及计算机视觉库的介绍: 1.1 Python Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新...
  • OpenCV 中的图像处理 23 图像变换23.1 傅里叶变换目标本小节我们将要学习: ? 使用 OpenCV 对图像进行傅里叶变换 ? 使用 Numpy 中 FFT(快速傅里叶变换)函数 ? 傅里叶变换的一些用处 ? 我们将要学习的函数有:...
  • OpenCV图像处理篇之图像平滑图像平滑算法程序分析及结果图像平滑算法图像平滑与图像模糊是同一概念,主要用于图像的去噪。平滑要使用滤波器,为不改变图像的相位信息,一般使用线性滤波器,其统一形式如下:其中h...
  • 边缘检测是图像处理与计算机视觉中的重要技术之一,其目的是检测识别出图像中亮度变化剧烈的像素点构成的集合。图像边缘的正确检测有利于分析目标检测、定位及识别,通常目标物体形成边缘存在以下几种情形: <1&...
  • 图像变换可以看作如下: 像素变换 – 点操作 邻域操作 – 区域 调整图像亮度和对比度属于像素变换-点操作 g(i,j)=αf(i,j)+βg(i,j) = αf(i,j) + βg(i,j)=αf(i,j)+β (其中 α&amp;gt;0,β是增益变量...
  • 通过灵活运用OpenCV图像处理相关API妙解这些常见问题,为刚参加工作的开发者提供了常见图像处理问题解决思路与案例集锦,课程收录了六个常见的具有代表性的案例,一一剖析、庖丁解牛帮助大家从根本上提高知识运用...
  • 图像ROI(Region of Interest) 图像通道的分割和合并 为图像制作边框(Padding) 本节中几乎所有的操作都与Numpy相关,而不是OpenCV。 需要熟悉Numpy才能使用OpenCV编写更好的优化代码。 注:本文翻译自...
  • 这是2018年写的第一篇关于opencv的文章,考虑到图像增强对于初学者来说比较容易理解,因此从该方向入手,通过一些程序案例,分析图像增强的原理并展示效果。 首先,什么是图像增强? 图像增强就是通过对像素值局部...
  • img=cv2.imread('1P40G41214-5.jpg') print(img.shape) print(img[100,100]) print(img[100,100,0]) print(img[100,100,1]) print(img[100,100,2]) #输出 # (1200, 1920, 3) # [121 167 208] ...
1 2 3 4 5 ... 20
收藏数 12,005
精华内容 4,802
关键字:

opencv提高图像处理