openCV - 4. 图像操作

读写图像、读写像素、修改像素值

读写图像

  • imread 可以指定加载为灰度或者RGB图像
  • Imwrite 保存图像文件,类型由扩展名决定

读写像素

  • 读一个GRAY像素点的像素值(CV_8UC1)

    Scalar intensity = img.at<uchar>(y, x); 
    或者
    Scalar intensity = img.at<uchar>(Point(x, y));
    
  • 读一个RGB像素点的像素值

    Vec3f intensity = img.at<Vec3f>(y, x); 
    float blue = intensity.val[0]; 
    float green = intensity.val[1]; 
    float red = intensity.val[2];
    

修改像素值

// 灰度图像
img.at<uchar>(y, x) = 128;

// RGB三通道图像
img.at<Vec3b>(y,x)[0]=128; // blue
img.at<Vec3b>(y,x)[1]=128; // green
img.at<Vec3b>(y,x)[2]=128; // red

// 空白图像赋值
img = Scalar(0);

// ROI选择
Rect r(10, 10, 100, 100); 
Mat smallImg = img(r);

Vec3b与Vec3F

  • Vec3b对应三通道的顺序是blue、green、red的uchar类型数据。
  • Vec3f对应三通道的float类型数据
  • 把CV_8UC1转换到CV32F1实现如下:src.convertTo(dst, CV_32F);

代码演示

#include <opencv2/core/core.hpp> 
#include <opencv2/imgcodecs.hpp> 
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** args) {
	Mat image = imread("D:/test.jpg", IMREAD_COLOR);
	if (image.empty()) {
	cout << "could not find the image resource..." << std::endl;
	return -1;
}

	int height = image.rows;
	int width = image.cols;
	int channels = image.channels();
	printf("height=%d width=%d channels=%d", height, width, channels);
  
	for (int row = 0; row < height; row++) {
       for (int col = 0; col < width; col++) {
                if (channels == 3) {
                         image.at<Vec3b>(row, col)[0] = 0; // blue
                         image.at<Vec3b>(row, col)[1] = 0; // green
                }
         }
	}

	namedWindow("My Image", CV_WINDOW_AUTOSIZE);
	imshow("My Image", image);
	waitKey(0);
	return 0;
}
posted @ 2020-06-23 16:37  CoderZjz  阅读(189)  评论(0编辑  收藏  举报