• 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;
    }
  • 相关阅读:
    0209利用innobackupex进行简单数据库的备份
    0208如何利用federated配置远程的数据库和本地数据相互交互
    0208MySQL5.7之Group Replication
    解决问题的方法
    0123简单配置LNMP
    0120Keeplived实现自动切换Mysql服务
    0116MySql主从复制监控
    大数据导入EXCEL
    OSI结构和TCP/IP模型
    ORA-12154 TNS无法解析指定的连接标识符
  • 原文地址:https://www.cnblogs.com/zgl19991001/p/11420299.html
Copyright © 2020-2023  润新知