可以使用数组或指针的方式对图像像素点进行访问。
void OpencvExample::Example_PixelOperation(Mat &image)
{
int channel = image.channels();
int h = image.rows;
int w = image.cols;
cout <<"height:" <<h <<","<< "width:"<<w << endl;
/* 以数组方式 */
#if 0
for (int row = 0; row < h; row++)
{
for (int col = 0; col < w; col++)
{
/* 单通道图像 */
if (1 == channel)
{
image.at<uchar>(row, col) = 255 - image.at<uchar>(row, col); //该点像素值取反
}
/* 三通道图像 */
if (3 == channel)
{
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];
}
}
namedWindow("OUT WINDOW", WINDOW_FREERATIO);
imshow("OUT WINDOW", image);
}
#endif
/* 以指针方式 */
#if 1
for (int row = 0; row < h; row++)
{
uchar *prow = image.ptr<uchar>(row);
for (int col = 0; col < w; col++)
{
/* 单通道图像 */
if (1 == channel)
{
*prow++ = 255 - *prow; //该点像素值取反
}
/* 三通道图像 */
if (3 == channel)
{
*prow++ = 255 - *prow;
*prow++ = 255 - *prow;
*prow++ = 255 - *prow;
}
}
namedWindow("OUT WINDOW", WINDOW_FREERATIO);
imshow("OUT WINDOW", image);
}
#endif
}