版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zl_95520/article/details/88890944
一、数组遍历(缺点:慢)
1、示例
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{
Mat src = imread("F:/Cvimage/test.png");
if (src.empty())
{
printf("could not load image....\n");
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
int height = src.rows; //读图片高度
int width = src.cols; //读取图片宽度
int ch = src.channels(); //读取图片通道数 rgb:三通道 灰色图像:单通道 rgba:四通道,多一个透明度
//数组读取图像像素
for (int c = 0; c < ch; c++)
{
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
if (ch == 3)
{
Vec3b bgr = src.at<Vec3b>(row, col);
bgr[0] = 255 - bgr[0]; //蓝 rgb 最大值为255,最终图像取反
bgr[1] = 255 - bgr[1]; //绿
bgr[2] = 255 - bgr[2]; //红
src.at<Vec3b>(row, col) = bgr;
}
else if(ch == 1)
{
int gray = src.at<uchar>(row, col);
src.at<uchar>(row, col) = 255 - gray;
}
}
}
}
imshow("output", src);
waitKey(0);
return 0;
}
2、结果展示
二、指针遍历
1、示例
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{
Mat src = imread("F:/Cvimage/test.png");
if (src.empty())
{
printf("could not load image....\n");
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
int height = src.rows; //读图片高度
int width = src.cols; //读取图片宽度
int ch = src.channels(); //读取图片通道数 rgb:三通道 灰色图像:单通道 rgba:四通道,多一个透明度
//指针读图图片像素
Mat result = Mat::zeros(src.size(), src.type()); //创建一个空白图像
int blue = 0, green = 0, red = 0;
int gray;
for (int c = 0; c < ch; c++)
{
for (int row = 0; row < height; row++)
{
uchar *curr_row = src.ptr<uchar>(row); //获取这一行所有像素点的首地址
uchar *result_row = result.ptr<uchar>(row);
for (int col = 0; col < width; col++)
{
if (ch == 3)
{
//一个像素点有3个像素值,红、绿、蓝,
blue = *curr_row++;
green = *curr_row++;
red = *curr_row++;
*result_row++ = blue;
*result_row++ = green;
*result_row++ = red;
}
else if(ch == 1)
{
gray = *curr_row++;
*result_row++ = gray;
}
}
}
}
imshow("reslut", result);
waitKey(0);
return 0;
}