美文网首页
OpenCV:四、图像的基础操作

OpenCV:四、图像的基础操作

作者: 马洪滔 | 来源:发表于2020-08-22 12:21 被阅读0次

    前言

    在上一章中描述了如何使用自己实现掩膜运算以及调用cv :: filter2D函数对图像进行掩膜运算矩阵的掩膜运算

    目标

    本章中,将学习如何:

    • 读写像素
    • 修改像素值
    • 计算反差图像

    读写像素

    • 在OpenCV中图像存储基本为Mat格式,如果我们想要获取GRAY图的像素点灰度值,可以通过img.at<uchar>(i,j)的方式轻松获取:
    Scalar gray = img.at<uchar>(i,j) 或者 Scalar intensity = img.at<uchar>(Point(j,i))
    
    • 其中有一个要注意的地方是i对应的是点y的坐标,j对应的是点的x坐标,所以建议在访问时都用img.at<uchar>(Point(j,i))这种形式访问,免去了点坐标和行列的转换。对于获取RGB图像的像素点的像素值则可以使用如下方法,来分别获取B、G、R三个通道的对应的值:
    Vec3f rgb = img.at<Vec3f>(i,j) 或者 Vec3f rgb = img.at<Vec3f>(Point(j,i)) 
    float blue = bgr.val[0];
    float green = bgr.val[1];
    float red = bgr.val[2];
    

    修改像素值

    • 修改灰度图像
    img.at<uchar>(Point(j,i)) = 128;
    
    • 修改RGB三通道图像
    img.at<Vec3f>(Point(j,i)) [0] = 128; //blue
    img.at<Vec3f>(Point(j,i)) [1] = 128; //green
    img.at<Vec3f>(Point(j,i)) [2] = 128; //red
    
    • 空白图像赋值
    img = Scalar(0)
    
    • ROI选择
    Rect r(10,10,100,100);
    Mat roiImg = img(r);
    

    源代码

    #include <opencv2/opencv.hpp>
    #include <iostream>
    #include <string>
    using namespace cv;
    using namespace std;
    int main( int argc, char** argv )
    {
            Mat grayImage;
        src = imread("../data/HappyFish.jpg", IMREAD_UNCHANGED);
        if (src.empty())
        {
            printf("Could not find the image!\n");
            return -1;
        }
        namedWindow("input", WINDOW_NORMAL);
        imshow("input", src);
        cvtColor(src, grayImage, COLOR_BGR2GRAY);
        namedWindow("gray", WINDOW_NORMAL);
        imshow("gray", grayImage);
        int rows = grayImage.rows;
        int cols = grayImage.cols;
        dst = Mat(grayImage.size(), grayImage.type());  // 示例对象
        // 反差图像
           dst.create(src.size(), src.type());
        int rows = src.rows;
        int cols = src.cols;
        int chls = src.channels();
        for (int row = 0; row < rows; row++)
        {
            for (int col = 0; col < cols; col++)
            {
                if (chls == 1)
                {
                    int gray = grayImage.at<uchar>(row, col);
                    dst.at<uchar>(row, col) = 255 - gray;
                }
                else if (chls == 3)
                {
                    int b = src.at<Vec3b>(row, col)[0];
                    int g = src.at<Vec3b>(row, col)[1];
                    int r = src.at<Vec3b>(row, col)[2];
                    dst.at<Vec3b>(row, col)[0] = 255 - b;
                    dst.at<Vec3b>(row, col)[1] = 255 - g;
                    dst.at<Vec3b>(row, col)[2] = 255 - r;
                }
    
            }
        }
           // 按位取反,和上述功能一致
        bitwise_not(src, dst);
        namedWindow("output", WINDOW_NORMAL);
        imshow("output", dst);
        waitKey(0); // Wait for a keystroke in the window
            return 0;
        }
    

    说明

    • Vec3b与Vec3f
      • Vec3b对应图像的三通道顺序是B、G、R的uchar类型数据。
      • Vec3f对应图像的三通道为Float类型的数据
      • 通过src.convertTo(dst,CV_32F)可以把CV_8UC1转到CV32F1类型

    相关文章

      网友评论

          本文标题:OpenCV:四、图像的基础操作

          本文链接:https://www.haomeiwen.com/subject/qizgdktx.html