文章目录
图像像素的读写操作
遍历和修改每个像素点的数值,分为单通道和多通道。
多通道可以看成是数组。
访问模式模式也有两种
第一种是数组访问模式,用最常规的数组下标访问像素值。
void QuickDemo::pixel_visit_demo(Mat &image)
{
int dims = image.channels();
int h = image.rows;
int w = image.cols;
for (int row = 0; row < h; row++)
{
for (int col = 0; col < w; col++)
{
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); //opencv特定的类型,获取三维颜色,3个值
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];//对彩色图像读取它的像素值,并且对像素值进行改写。
}
}
}
namedWindow("像素读写演示", WINDOW_FREERATIO);
imshow("像素读写演示", image);
}
第二种为指针访问模式,指定一个指针为图片的首地址,通过循环遍历,指针++,一次往后推。
void QuickDemo::pixel_visit_demo(Mat &image)
{
int dims = image.channels();
int h = image.rows;
int w = image.cols;
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;//得到像素值
*current_row++ = 255 - pv;//给像素值重新赋值
}
if (dims == 3) //三通道的彩色图像
{
*current_row++ = 255 - *current_row; //指针每做一次运算,就向后移动一位
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
}
}
}
namedWindow("像素读写演示", WINDOW_FREERATIO);
imshow("像素读写演示", image);
}