opencv基本函数详解笔记

一、读取保存图片
    Mat scrImage = imread("1.jpg");
    //显示图像
    imshow("原图", scrImage);
    //窗口等待
    waitKey(2000);
    //窗口销毁
    destroyAllWindows();
    //图片另存为
    //imwrite("D://");
    return 0;
二、图片的腐蚀操作
    Mat srcImage = imread("1.jpg");
    //显示原图
    resize(srcImage, srcImage, Size(srcImage.cols / 4, srcImage.rows / 4));
    imshow("原图", srcImage);
    //进行腐蚀操作
    //获取图像的指定形状和尺寸的结构元素矩形:MORPH_RECT;交叉形:MORPH_CROSS;椭圆形:MORPH_ELLIPSE;
    Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));//结构元素(内核矩阵)的尺寸15x15
    Mat dstImage;
    //erode腐蚀
    erode(srcImage, dstImage, element);
    //显示效果图
    imshow("效果图",dstImage);
三、均值滤波(图片模糊处理)
    Mat srcImage1;
    //读入图片
    Mat srcImage = imread("3.jpg");
    //缩小显示原图
    resize(srcImage, srcImage1, Size(srcImage.cols/4,srcImage.rows/4));
    imshow("原图", srcImage1);
    //均值滤波模糊图片
    Mat dstImage;
    blur(srcImage1, dstImage, Size(7, 7));//滤波模板kernel的尺寸,一般使用Size(w, h)来指定,如Size(3,3) 
    //显示效果图
    imshow("效果图", dstImage);
四、Canny算子边缘检测
     //读入图片
    Mat srcImage = imread("3.jpg");
    Mat srcImage1;
    resize(srcImage, srcImage1, Size(srcImage.cols / 4, srcImage.rows / 4));
    //定义
    Mat dstImage, edge, grayImage;
    //【1】创建与src同类型和大小的矩阵(dst)
    //dstImage.create(srcImage.size(), srcImage.type());
    //转为灰度图
    cvtColor(srcImage1, grayImage, COLOR_BGR2GRAY);
    //均值滤波
    blur(grayImage, edge, Size(3, 3));
    //Canny算子
    Canny(edge, edge, 3, 9, 3);//3,9表示阈值最后一个参数3*3的算子
    //【5】显示效果图 
    imshow("【效果图】Canny边缘检测", edge);
    //********************************//
    cvCanny
    函数功能:采用Canny方法对图像进行边缘检测

    函数原型:

    void cvCanny(

      const CvArr* image,

      CvArr* edges,

      double threshold1,double threshold2,

      int aperture_size=3

    );

    函数说明:

    第一个参数表示输入图像,必须为单通道灰度图。

    第二个参数表示输出的边缘图像,为单通道黑白图。

    第三个参数和第四个参数表示阈值,这二个阈值中当中的小阈值用来控制边缘连接,
    大的阈值用来控制强边缘的初始分割即如果一个像素的梯度大与上限值,则被认为是边缘像素,
    如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个点与高于上限值的像素点连接时我们才保留,否则删除。

    第五个参数表示Sobel 算子大小,默认为3即表示一个3*3的矩阵。Sobel 算子与高斯拉普拉斯算子都是常用的边缘算子,详细的数学原理可以查阅专业书籍。

    好文要顶 关注我 收藏该文    
    //********************************//
五、读取视屏
    //读入视屏
    VideoCapture capture("1.avi");
    //循环显示每一帧
    while (1)
    {
        Mat frame;//定义变量,存储每一帧的图像
        capture >> frame;//读取当前的帧数
        imshow("读取视屏", frame);//显示当前帧
        waitKey(30);
    }
    return 0;
六、调用摄像头
    //调用摄像头
    VideoCapture capture(0);
    //循环显示每一帧
    while (1)
    {
        Mat frame;  //定义一个Mat变量,用于存储每一帧的图像9u【
        
        capture >> frame;  //读取当前帧
        imshow("读取视频", frame);  //显示当前帧
        waitKey(30);  //延时30ms
    }
    return 0;
七、Log变换
    Mat image = imread("5.png");
    Mat imageLog(image.size(), CV_32FC3);//定义一个和原图一样大小,浮点型
    float c = 0.1;
    for (int i = 0; i < image.rows; i++)
    {
        for (int j = 0; j < image.cols; j++)
        {
            imageLog.at<Vec3f>(i, j)[0] = c * log(1 + image.at<Vec3b>(i,j)[0]);
            imageLog.at<Vec3f>(i, j)[1] = c * log(1 + image.at<Vec3b>(i, j)[1]);
            imageLog.at<Vec3f>(i, j)[2] = c * log(1 + image.at<Vec3b>(i, j)[2]);
        }
    }
    //归一化到0~255 
    normalize(imageLog, imageLog, 0, 255, CV_MINMAX);
    //转换成8bit图像显示 
    convertScaleAbs(imageLog, imageLog);
    imshow("原图",image);
    imshow("图二", imageLog);
八、幂变换
    Mat img = imread("3.jpg");//读入图片,0表示读入灰度图
    resize(img, img, Size(img.cols / 4, img.rows / 4));
    //浮点变换
    Mat fimg(img.size(), CV_32FC3);
    img.convertTo(fimg, CV_32FC3,1/255.0);
    float e = 0.5;//针对不同的照片进行取值
    //将修改后的像素值存入另一个照片
    Mat fimg2(fimg.size(), CV_32FC3);
    for (int i = 0; i < fimg.rows; i++)
    {
        for (int j = 0; j < fimg.cols; j++)
        {
            fimg2.at<Vec3f>(i, j)[0] = float(pow(fimg.at<Vec3f>(i, j)[0], e));
            fimg2.at<Vec3f>(i, j)[1] = float(pow(fimg.at<Vec3f>(i, j)[1], e));
            fimg2.at<Vec3f>(i, j)[2] = float(pow(fimg.at<Vec3f>(i, j)[2], e));
        }
    }
    imshow("原图", img);
    imshow("rgb", fimg2);
    waitKey(0);
九、添加椒盐噪声
    Mat add(Mat img, int n)
{
    Mat dstimage = img.clone();
    for (int k = 0; k < n; k++)
    {
        //随机取值行列
        int i = rand() % dstimage.rows;
        int j = rand() % dstimage.cols;
        //图像通道判定
        if (dstimage.channels() == 1)
        {
            dstimage.at<uchar>(i, j) = 255;//椒噪声
        }
        else
        {
            
            dstimage.at<Vec3b>(i, j)[0] = 255;
            dstimage.at<Vec3b>(i, j)[1] = 255;
            dstimage.at<Vec3b>(i, j)[2] = 255;
        }
    }
    for (int k = 0; k < n; k++)
    {
        //随机取值行列  
        int i = rand() % dstimage.rows;
        int j = rand() % dstimage.cols;
        //图像通道判定  
        if (dstimage.channels() == 1)
        {
            dstimage.at<uchar>(i, j) = 0;     //椒噪声  
        }
        else
        {
            dstimage.at<Vec3b>(i, j)[0] = 0;
            dstimage.at<Vec3b>(i, j)[1] = 0;
            dstimage.at<Vec3b>(i, j)[2] = 0;
        }
    }
    return dstimage;
}

 

posted @ 2019-08-27 19:26  魔仙小丽丽  阅读(815)  评论(0编辑  收藏  举报