一.基于数组的下标形式
void Demo::visit_demo(Mat& img)
{
int w = img.cols;//宽度
int h = img.rows;//高度
int dim = img.channels();//通道数
for (int row = 0; row < h; row++)
{
for (int col = 0; col < w; col++)
{
if (dim == 1)
{
uchar pv = img.at<uchar>(row, col);
img.at <uchar>(row, col) = 255 - pv;
}
if (dim == 3)
{
Vec3b bgr = img.at<Vec3b>(row, col);//
img.at<Vec3b>(row, col)[0] = 255 - bgr[0];//第0个通道
img.at<Vec3b>(row, col)[1] = 255 - bgr[1];//第1个通道
img.at<Vec3b>(row, col)[2] = 255 - bgr[2];//第2个通道
}
}
}
imshow("图像显示", img);
}
1. at()函数
函数at()用于读取矩阵中的某个像素,或者对某个像素进行赋值操作。
//读取一个GRAY的像素值(CV_8UC1)
Scalar intensity=img.at<uchar>(y,x);
//或者
Scalar intensity=img.at<uchar>(Point(y,x));
//读取一个RGB图像的像素值
Vec3f intensity=img.at<Vec3f>(y,x);
float blue=intensity.val[0];
float green=intensity.val[1];
float red=intensity.val[2];
2.灰度图像的读取
uchar value = grayim.at<uchar>(i,j);//读出第 i 行第 j 列像素值
grayim.at<uchar>(i,j)=128; //将第 i 行第 j 列像素值设置为 128
3.RGB三通道图像
image.at<Vec3b>(y,x)[0]=128;//blue
image.at<Vec3b>(y,x)[1]=128;//green
image.at<Vec3b>(y,x)[2]=128;//red
二.基于指针
void Demo::visit_demo(Mat& image)
{
int w = image.cols;
int h = image.rows;
int dims = image.channels();
for (int row = 0; row < image.rows; row++)
{
uchar* current_row = image.ptr<uchar>(row);
for (int col = 0; col < image.cols; col++)
{
if (dims == 1) {//灰度图像
*current_row++ = 255 - *current_row;
}
if (dims == 3) {//获取彩色
*current_row++ = 255 - *current_row;//获取像素点的值
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
}
}
}
imshow("像素的读写", image);
}