OpenCV4---像素操作(读写像素、修改像素值)

四、像素操作(读写像素、修改像素值)
1、遍历图像像素

int height = gray_src.rows;//获取图像行数
int width = gray_src.cols;//获取图像列数
for (int row = 0; row < height; row++) {//遍历图像各个像素点的像素值
    for (int col = 0; col < width; col++) {
    
    }
}

2、获取图像像素值
读一个GRAY像素点的像素值

int gray = image.at<uchar>(row, col);

读一个RGB像素点的像素值

int b = image.at<Vec3b>(row, col)[0];//获取row行col列0通道的像素值,Vec3b可以用来读取三通道的RGB图像像素值
int g = image.at<Vec3b>(row, col)[1];//获取row行col列1通道的像素值
int r = image.at<Vec3b>(row, col)[2];//获取row行col列2通道的像素值

3、修改像素值
灰度图像image.at<uchar> (row,col) = 目标像素值
RGB三通道图像:

image.at<Vec3b>(row, col)[0] = 目标像素值;//修改row行col列0通道的像素值
image.at<Vec3b>(row, col)[1] = 目标像素值;//修改row行col列1通道的像素值
image.at<Vec3b>(row, col)[2] = 目标像素值;//修改row行col列2通道的像素值

空间图像赋值image = Scalar(0);
生成灰度图:

gray_src.at<uchar>(row, col) = min(r, min(b,g));//取RGB中的最小值作为灰度值
gray_src.at<uchar>(row, col) = max(r, max(b,g));//取RGB中的最大值作为灰度值

4、反转图像色彩
反转灰度图像gray_image.at<uchar>(row, col) = 255 - gray;
反转RGB图像

image.at<Vec3b>(row, col)[0] = 255 - b;//反转row行col列0通道的像素值
image.at<Vec3b>(row, col)[1] = 255 - g;//反转row行col列1通道的像素值
image.at<Vec3b>(row, col)[2] = 255 - r;//反转row行col列2通道的像素值

利用函数实现图像色彩反转bitwise_not(原图像, 反转后图像);

5、去掉图像某一通道色彩

image.at<Vec3b>(row, col)[0] = b;//保持row行col列0通道的像素值
image.at<Vec3b>(row, col)[1] = g;//保持row行col列1通道的像素值
image.at<Vec3b>(row, col)[2] = 0;//清零row行col列2通道的像素值

反转图像色彩示例代码:

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

using namespace cv;
using namespace std;

int main(int argc, char** argv) {
    Mat src;
    src = imread("C:/Users/26839/Pictures/测试.png");
    if (src.empty()) {
     cout << "could not load image...\n" << endl;
     return -1;
    }
    imshow("input", src);
    
    Mat dst;
    dst.create(src.size(), src.type());//构造一张与src大小类型一致的图片dst
    int height = src.rows;
    int width = src.cols;
    int nc = src.channels();

    
    for (int row = 0; row < height; row++) {//遍历图像各个像素点的像素值
        for (int col = 0; col < width; col++) {
            if (nc == 1) {//使单通道图片色彩反转
                int gray = src.at<uchar>(row, col);//获取像素值
                dst.at<uchar>(row, col) = 255 - gray;//反转图像
 	    } else if (nc == 3) {//使3通道图片色彩反转
                  int r = src.at<Vec3b>(row, col)[0];//获取row行col列0通道的像素值,Vec3b可以用来读取三通道的RGB图像像素值
                  int g = src.at<Vec3b>(row, col)[1];//获取row行col列1通道的像素值
                  int b = src.at<Vec3b>(row, col)[2];//获取row行col列2通道的像素值
                  dst.at<Vec3b>(row, col)[0] = 255 - r;//反转row行col列0通道的像素值
                  dst.at<Vec3b>(row, col)[1] = 255 - g;//反转row行col列1通道的像素值
                  dst.at<Vec3b>(row, col)[2] = 255 - b;//反转row行col列2通道的像素值
            }
        }
    }

    //bitwise_not(src, dst);//反转图像色彩的函数
    
    imshow("invert", dst);
    waitKey(0);
    destroyAllWindows();
    return 0;
}

输出运行结果如下所示:

原始图像

OpenCV4---像素操作(读写像素、修改像素值)

反转处理后的图像

OpenCV4---像素操作(读写像素、修改像素值)

上一篇:伪静态与重定向--RewriteBase


下一篇:make 编译 linux 内核是单线程的任务 才用-j4命令使用4 线程加速