首页 > 编程语言 > 详细

OpenCV-C++ 图像的操作

时间:2021-04-05 21:55:10      阅读:32      评论:0      收藏:0      [点我收藏+]

这一节主要介绍的内容主要包括:

  • 读取图像;
  • 修改像素值;

读取图像

// 读取图像
Mat src = imread("/home/chen/dataset/lena.jpg");
if (src.empty()){
    printf("could not load image.\n");
    return -1;
}

// 显示图像
namedWindow("src", WINDOW_AUTOSIZE);
imshow("src", src);
waitKey(0);

修改图像像素值

1. 将RGB图像转换成灰度图,并与255相减

// 1. 将RGB转换成Gray,利用255去减像素
Mat dst;
cvtColor(src, dst, COLOR_BGR2GRAY);
int rows = dst.rows;
int cols = dst.cols;
for (int row = 0; row < rows -1; row++){
    for (int col = 0; col < cols - 1; col++){
        int pixel = dst.at<uchar>(row, col);
        dst.at<uchar>(row, col) = 255 - pixel;
    }
}

namedWindow("dst", WINDOW_AUTOSIZE);
imshow("dst", dst);

技术分享图片

2. 对原图像(三通道),并与255相减

// 2. 对三维图像,利用255减去像素
int rows = src.rows;
int cols = src.cols;
Mat dst;
dst.create(src.size(), src.type());
for (int row = 0; row < rows - 1; row++){
    for (int col = 0; col < cols - 1; col++){
        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;

    }
}
namedWindow("dst", WINDOW_AUTOSIZE);
imshow("dst", dst);

第二种方法:

// 2.1 对三维图像,利用255减去像素
Mat dst;
bitwise_not(src, dst);
namedWindow("dst", WINDOW_AUTOSIZE);
imshow("dst", dst);

第三种方法:

Mat dst;
dst.create(src.size(), src.type());
dst = Scalar(255, 255, 255) - src;
namedWindow("dst", WINDOW_AUTOSIZE);
imshow("dst", dst);

三种处理方式,结果图像如下所示:
技术分享图片

完成的代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(){

    // 读取图像
    Mat src = imread("/home/chen/dataset/lena.jpg");
    if (src.empty()){
        printf("could not load image.\n");
        return -1;
    }

    // 1. 将RGB转换成Gray,利用255去减像素
    // Mat dst;
    // cvtColor(src, dst, COLOR_BGR2GRAY);
    // int rows = dst.rows;
    // int cols = dst.cols;
    // for (int row = 0; row < rows -1; row++){
    //     for (int col = 0; col < cols - 1; col++){
    //         int pixel = dst.at<uchar>(row, col);
    //         dst.at<uchar>(row, col) = 255 - pixel;
    //     }
    // }

    // namedWindow("dst", WINDOW_AUTOSIZE);
    // imshow("dst", dst);

    // 2. 对三维图像,利用255减去像素
    // int rows = src.rows;
    // int cols = src.cols;
    // Mat dst;
    // dst.create(src.size(), src.type());
    // for (int row = 0; row < rows - 1; row++){
    //     for (int col = 0; col < cols - 1; col++){
    //         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;

    //     }
    // }
    
    // 2.1 对三维图像,利用255减去像素
    // Mat dst;
    // bitwise_not(src, dst);
    // namedWindow("dst", WINDOW_AUTOSIZE);
    // imshow("dst", dst);

    Mat dst;
    dst.create(src.size(), src.type());
    dst = Scalar(255, 255, 255) - src;
    namedWindow("dst", WINDOW_AUTOSIZE);
    imshow("dst", dst);

    // 显示图像
    namedWindow("src", WINDOW_AUTOSIZE);
    imshow("src", src);
    waitKey(0);

    return 0;
}

OpenCV-C++ 图像的操作

原文:https://www.cnblogs.com/chenzhen0530/p/14619372.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!