访问Mat中每个像素的值(简单的图像取反)
来源:互联网 发布:学java就业好么 编辑:程序博客网 时间:2024/06/10 00:26
访问Mat中每个像素的值
方法0:.ptr和[]操作符
Mat最直接的访问方法是通过.ptr<>函数得到一行的指针,并用[]操作符访问某一列的像素值。
int main(int argc, char* argv[]) {Mat img = imread("E:\\11.jpg");int nr = img.rows; // number of rows int nc = img.cols * img.channels(); // total number of elements per line for (int i = 0; i <nr; i++){uchar* data = img.ptr<uchar>(i);for (int j = 0; j < nc; j++){data[j] = 255 - data[j];//我是简单的像素取反,可以其他操作的}}namedWindow("img");imshow("img", img);waitKey(0);system("pause");return 0;}
方法一:.ptr和指针操作
除了[]操作符,我们可以移动指针*++的组合方法访问某一行中所有像素的值。
int main(int argc, char* argv[]) {Mat img = imread("E:\\11.jpg");int nr = img.rows; // number of rows int nc = img.cols * img.channels(); // total number of elements per line for (int i = 0; i <nr; i++){uchar* data = img.ptr<uchar>(i);for (int j = 0; j < nc; j++){*data++ = 255 - *data;}}namedWindow("img");imshow("img", img);waitKey(0);system("pause");return 0;}
方法二:用Mat提供的迭代器代替前面的[]操作符或指针
int main(int argc, char* argv[]) {Mat img = imread("E:\\11.jpg");cv::Mat_<cv::Vec3b>::iterator it = img.begin<cv::Vec3b>();cv::Mat_<cv::Vec3b>::iterator itend = img.end<cv::Vec3b>();for (; it != itend; ++it){(*it)[0] = 255 - (*it)[0];(*it)[1] = 255 - (*it)[1];(*it)[2] = 255 - (*it)[2];}namedWindow("img");imshow("img", img);waitKey(0);system("pause");return 0;}方法三:图像坐标
int main(int argc, char* argv[]) {Matimg = imread("E:\\11.jpg");int nr = img.rows; // number of rows int nc = img.cols; // number of columns for (int j = 0; j<nr; j++) {for (int i = 0; i<nc; i++) {img.at<cv::Vec3b>(j, i)[0] = 255 - img.at<cv::Vec3b>(j, i)[0];img.at<cv::Vec3b>(j, i)[1] = 255 - img.at<cv::Vec3b>(j, i)[1];img.at<cv::Vec3b>(j, i)[2] = 255 - img.at<cv::Vec3b>(j, i)[2];} // end of row }namedWindow("img");imshow("img", img);waitKey(0);system("pause");return 0;}方法四:创建输出图像
之前的方法都是直接修改原图,方法四新建了输出图像。
阅读全文