(1)方法一:使用for循环利用访问数组的原理对图像的像素进行读写操作,其中用到了image.at<uchar>(col,row) 来获取图像像素的位置坐标(单通道)。当图像是三通道的时候用到了image.at<Ver3b>(col,row)来获取图像像素的位置坐标(三通道)。
#include<quickopencv.h>
#include<iostream>
using namespace std;
void QuickDemo::pixel_visit_demo(Mat &image) {
int w = image.cols;
int h = image.rows;
int dims = image.channels();
for (int col = 0; col < w;col++) {
for (int row = 0; row < h;row++) {
if (dims==1)//灰度图像
{
int pv = image.at<uchar>(row, col);
image.at<uchar>(row, col) = 255 - pv;
}
if (dims == 3)//彩色图像
{
Vec3b bgr = image.at<Vec3b>(row, col);
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];
}
imshow("转化图像", image);
}
}
}
(2)方法二:使用for循环利用指针的原理对图像的像素进行读写操作,其中用到了*current_row++逐行递加,并获取指针的地址从而来获取图像像素的位置坐标。
#include<quickopencv.h>
#include<iostream>
using namespace std;
void QuickDemo::pixel_visit_demo(Mat &image) {
int w = image.cols;
int h = image.rows;
int dims = image.channels();
for (int col = 0; col < w; col++) {
uchar *current_col = image.ptr<uchar>(col);
for (int row = 0; row < h; row++) {
if (dims == 1)//灰度图像
{
int pv = *current_col;
*current_col++ = 255 - pv;
}
if (dims == 3)//彩色图像
{
*current_col++ = 255 - *current_col;
*current_col++ = 255 - *current_col;
*current_col++ = 255 - *current_col;
}
imshow("转化图像", image);
}
}
}