OpenCV入门

    • 加盐
    void MainWindow::salt(cv::Mat &image, int n)
    {
        std::default_random_engine e(time(0));
        std::uniform_int_distribution<int> u1(0, image.rows);
        std::uniform_int_distribution<int> u2(0, image.cols);
        for(int k = 0; k < n; k++){
            int i = u1(e), j = u2(e);
            if(image.channels() == 1) //单通道
            {
                //image.at<uchar>(i, j) = 255;
                //还可以这样写
                cv::Mat_<uchar> im2 = image;
                im2(i, j) = 255;
            }
            else if(image.channels() == 3) //三通道
            {
                // image.at<cv::Vec3b>(i, j)[0] = 255; // 还有二维和思维元素向量类型,cv::Vec2b和cv::Vec4b
                // image.at<cv::Vec3b>(i, j)[1] = 255;
                // image.at<cv::Vec3b>(i, j)[2] = 255;
                //这样写
                cv::Mat_<cv::Vec3b> im2 = image;
                im2(i, j)[0] = 255;
                im2(i, j)[1] = 255;
                im2(i, j)[2] = 255;
            }
        }
    }

    减少图像中颜色数目

    void MainWindow::colorReduce(const cv::Mat &image, cv::Mat &result, int div)
    {
        int n = image.rows;
        int m = image.cols;
        if(image.isContinuous()) //图像是否连续?
        {
            //没有对图像进行填补
            m = n * m;
            n = 1;
        }
        int op = static_cast<int>(log2(div * 1.0));
        uchar mask = 0xFF << op;
        for(int i = 0; i < n; i++)
        {
            const uchar *data = image.ptr<uchar>(i); //行首指针
            uchar *res = result.ptr<uchar>(i);
            for(int j = 0; j < m; j++)
            {
                //处理每个像素
                *res++ = ((*data++)&mask) + div / 2;
                *res++ = ((*data++)&mask) + div / 2;
                *res++ = ((*data++)&mask) + div / 2;
            }
        }
    }

    用拉普拉斯算子锐化

    void MainWindow::sharpen2D(const cv::Mat &image, cv::Mat &result)
    {
        //构造核(init 0)
        cv::Mat kernel(3, 3, CV_32F, cv::Scalar(0));
        kernel.at<float>(1, 1) = 5.0;
        kernel.at<float>(0, 1) = -1.0;
        kernel.at<float>(2, 1) = -1.0;
        kernel.at<float>(1, 0) = -1.0;
        kernel.at<float>(1, 2) = -1.0;
        cv::filter2D(image, result, image.depth(), kernel);
    
    }

    cv::MatQImage

    QImage *result;
    result = new QImage((const uchar*)image.data, image.cols, image.rows, image.step, QImage::Format_RGB888);

    图像直方图

    cv::MatND Histogram1D::getHistogram(const cv::Mat &image)
    {
        cv::MatND hist;
        cv::calcHist(&image,
                     1,     //计算单张图像的直方图
                     channels,  //通道数量
                     cv::Mat(), //不使用掩码
                     hist, //返回的直方图
                     1,     //1维
                     histSize, //项的数量
                     range//像素值的范围
                     );
        qDebug()<<"zhifangtu\n";
        for(int i= 0; i < 256; i++){
            qDebug()<<i<<"  "<<hist.at<float>(i)<<endl;
        }
        return hist;
    }
    
    cv::Mat Histogram1D::getHistogramImage(const cv::Mat &image)
    {
        cv::MatND hist = getHistogram(image);
    
        double maxVal = 0, minVal = 0;
        cv::minMaxLoc(hist, &minVal, &maxVal, 0, 0);
        cv::Mat histImg(histSize[0], histSize[0], CV_8U, cv::Scalar(255));
    
        int hpt = static_cast<int>(0.9 * histSize[0]);
        for(int i = 0; i < histSize[0]; i++)
        {
            float binVal = hist.at<float>(i);
            int intensity = static_cast<int>(binVal * hpt / maxVal);
            cv::line(histImg,
                    cv::Point(i, histSize[0]),
                    cv::Point(i, histSize[0]-intensity),
                    cv::Scalar::all(0));
        }
        return histImg;
    }
    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值