图像像素的读写操作
C++中的像素遍历与访问
数组遍历
指针方式遍历
Python中的像素遍历与访问
数组遍历
运行结果图:
相对于上一节多了以下代码:
/// <summary>
/// 图像像素的读写操作
/// </summary>
/// <param name="image"></param>
void QuickDemo::pixel_visit_demo(Mat& image) {
//宽
int w = image.cols;
//高
int h = image.rows;
//通道数
int dims = image.channels();
/*for (int row = 0; row < h; row++)
{
for (int col = 0; col < w; col++)
{
//灰度图像,单通道
if (dims == 1) {
int pv = image.at<uchar>(row, col);//(行/y/高,列/x/宽)
image.at<uchar>(row, col) = 255 - pv;
}
//彩色图像,三通道
if (dims == 3) {
Vec3b bgr = image.at<Vec3b>(row, col);//(行/y/高,列/x/宽)
image.at<Vec3b>(row, col)[0] = 255 - bgr[0];
image.at<Vec3b>(row, col)[1] = 255 - bgr[1];
image.at<Vec3b>(row, col)[2] = 255 - bgr[2];
}
}
}
*/
//指针操作
for (int row = 0; row < h; row++)
{
uchar* current_row = image.ptr<uchar>(row);
for (int col = 0; col < w; col++)
{
//灰度图像,单通道
if (dims == 1) {
int pv = *current_row;//(行/y/高,列/x/宽)
*current_row++ = 255 - pv;
}
//彩色图像,三通道
if (dims == 3) {
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
}
}
}
imshow("像素读写显示", image);
}
界面图如下:
#pragma once
#include<opencv2/opencv.hpp>
using namespace cv;
class QuickDemo {
public:
void colorSpace_Demo(Mat& image);
void mat_creation_demo();
void pixel_visit_demo(Mat& image);
};
#include<opencv2/opencv.hpp>
#include<quickopencv.h>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
//灰色
//Mat scr = imread("F:/vcworkspaces/opencv_tutorial_data-master/images/lena.png",IMREAD_GRAYSCALE);
//任意深度
Mat scr = imread("F:/vcworkspaces/opencv_tutorial_data-master/images/lena.png");//三通道顺序B G R
//调整窗口大小
namedWindow("输入窗口", WINDOW_FREERATIO);
if (scr.empty())
{
printf("Not image");
return -1;
}
//仅支持8位
imshow("输入窗口", scr);
QuickDemo qd;
//qd.mat_creation_demo();
qd.pixel_visit_demo(scr);
//人眼帧率至少300帧
waitKey(0);
//销毁单个特定窗口
destroyAllWindows;
return 0;
}