本文详细介绍了如何在C++项目中使用OpenCV进行图像像素的读写操作,包括使用头文件声明Pixel类,通过遍历和指针方式处理灰度图和彩色图,以及在主函数中调用这些操作。
数组遍历的方式进行图像像素读写
void QuickDemo::pixelVisit_Demo(Mat& image) {
namedWindow("像素读写显示", WINDOW_FREERATIO);
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);//获取像素
image.at<uchar>(row, col) = 255 - pv;
}
else {//彩色图像
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];
}
}
}
*/
//指针
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;
}
else {//彩色图像
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
}
}
}
imshow("像素读写显示", image);
}
int h = image.rows;
,行是高int w = image.cols;
,列是宽image.channels();
,获取传入图片的通道数
单通道灰度图处理:
image.at<uchar>(row, col);
获取图片的像素通过图片对象.at
方法操作
图片的每个像素都是字符类型的,通过uchar
进行储存
因为要输出显示,故通过int yy = image.at<uchar>(row, col);
将字符类型转换为int类型
image.at<uchar>(row, col) = 255 - yy;
,为了对图片像素操作效果明显,这里取反
三通道彩色图处理:
image.at<Vec3b>(row, col);
,通过Vec3b一次性存储三颜色通道的像素点值
image.at<Vec3b>(row, col)[0] = 255 - bgr[0];
,因为是三颜色通道,为了对像素操作显示效果明显,也取反,其他通道也类似
显示图片:
namedWindow("像素读写显示", WINDOW_FREERATIO);
,定义一个窗口名,自适应缩放imshow("像素读写显示", image);,显示即可
指针遍历的方式进行图像像素读写
uchar* current_row = image.ptr<uchar>(row);
获取当前行的指针,因为图片数据是uchar类型的,故定义的指针也应该是uchar类型