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;
}

猜你喜欢

转载自blog.csdn.net/yijiull/article/details/81364927
今日推荐