您的位置:首页 > 运维架构

OpenCV学习1 Mat图像的常见读写方式

2017-12-03 20:30 267 查看

方式一:at函数的读写

对于一幅图像可以使用imread()读取成mat类型

Mat Image = imread("lena.bmp");

对三通道的图像进行读写操作

for (int i = 0; i < Image.rows; i++)
{
for (int j = 0; j < Image.cols; j++)
{
//Image.at<Vec3b>(i, j)[0] = (i) % 255;
//Image.at<Vec3b>(i, j)[1] = (j) % 255;
//Image.at<Vec3b>(i, j)[2] = 0;

Vec3b pixel;
pixel[0] = (i) % 255;
pixel[1] = (j) % 255;
pixel[2] = 0;
Image.at<Vec3b>(i, j) = pixel;
}
}

能得到以下的图像



三通道图像中 pixel[0]表示的是Blue通道,pixel[1]表示的Green通道,而pixel[2]表示的是Red通道,因此上面程序令红色通道为零了,

所以显示的图像没有红色分量。

如果是图像是一通道那么采用以下代码

if (Image.channels() == 1)
{
for (int i = 0; i < Image.rows ; ++i)
{
for (int j = 0; i < Image.cols; ++j)
{
Image.at<uchar>(i, j) = (i + j) % 255;
}
}
}

方式二:指针方式读写

if(Image.channels() == 1)
{
for (int i = 0; i < Image.rows; i++)
{
uchar *p = Image.ptr<uchar>(i);
for (int j = 0; j < Image.cols; j++)
{
p[j] = (i + j) % 255;
}
}

}
该段代码用的是指针的方式读写操作一个一通道的图像,得到的图像结果为



方式三:迭代器方式读写

MatIterator_<Vec3b> colorit, colorend;
for (colorit = Image.begin<Vec3b>(), colorend = Image.end<Vec3b>(); colorit != colorend; ++colorit)
{
(*colorit)[0] = rand() % 255;
(*colorit)[1] = rand() % 255;
(*colorit)[2] = rand() % 255;
}

该段代码读写一个三通道的图像,可以看到迭代器方式不用遍历行和列了,利用了随机函数得到的肯定是一个随机像素图像



当然还有查找表方式,利用单位长度 的读取等方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: