示例代码如下:
void demo::pixel_demo(Mat &image)
{
int w = image.cols;
int h = image.rows;
int dims = image.channels();
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w; j++)
{
if (dims == 1)//灰度图像
{
int p = image.at<uchar>(i, j);
image.at<uchar>(i, j) = 255 - p;
}
if (dims == 3)//彩色图像
{
Vec3b g = image.at<Vec3b>(i, j);
image.at<Vec3b>(i, j)[0] = 255 - g[0];
image.at<Vec3b>(i, j)[1] = 255 - g[1];
image.at<Vec3b>(i, j)[2] = 255 - g[2];
}
}
}
imshow("像素图像", image);
}
这次主要是进一步学习Mat(矩阵)
通过image.at<uchar>(i,j)可以获得图像image在位置(i,j)的像素大小,因为灰度图像像素点只有一个值,uchar表示一个unsigned char 的大小。
在opencv中Vec3b表示三个数的列表,也存在Vec3i和Vec3f。
结果如下:
下面是用指针的方式改变像素
void demo::pixel_demo(Mat &image)
{
int w = image.cols;
int h = image.rows;
int dims = image.channels();for (int i = 0; i < h; i++)
{
uchar*p = image.ptr<uchar>(i);
for (int j = 0; j < w; j++)
{
if (dims == 1)
{
*p++ = 255 - *p;//先赋值再加加
}
if (dims == 3)
{
*p++ = 255 - *p;//先赋值再加加
*p++ = 255 - *p;//先赋值再加加
*p++ = 255 - *p;//先赋值再加加
}
}
}
imshow("像素图像", image);}
结果相同:
over!!!