OpenCV(总结篇)图像逐像素访问(三种操作:指针、迭代器、at()函数)
生活随笔
收集整理的這篇文章主要介紹了
OpenCV(总结篇)图像逐像素访问(三种操作:指针、迭代器、at()函数)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄
概述
1、指針訪問
2、迭代器訪問
3、at()函數(shù)訪問
總代碼
效果
參考資料
概述
訪問圖像像素值是圖像處理的基本操作。OpenCV提供了很多訪問方式,比較常用的三種方式:?
(1) 通過指針訪問 (逐通道)
(2) 通過迭代器訪問 (逐像素)
(3) 動態(tài)地址計算,通過at()函數(shù)實現(xiàn)(逐像素)
方法比較:?
(1)用指針訪問像素,速度最快;但在彩色圖像處理中,如果要單獨對某一個顏色分量處理,則需要通過數(shù)學(xué)公式計算,不是很直觀;?
(2)推薦用通過迭代器訪問像素,速度快,而且提取BGR某一顏色分量很方便。?
(3)at()函數(shù)適用于隨機訪問某個具體的像素點(已知該像素點行、列坐標(biāo)),不建議用at()函數(shù)遍歷整個圖。
1、指針訪問
指針逐通道訪問?
//方式1:指針操作(逐通道訪問)
void Handle_Ptr()
{uchar* p;//彩圖for (int i = 0; i < src.rows; i++){p = src.ptr<uchar>(i); //指向每一行首地址for (int j = 0; j < src.cols * src.channels(); j++){p[j] = 255 - p[j]; //反差處理}}//灰度圖for (int i = 0; i < src_gray.rows; i++){p = src_gray.ptr<uchar>(i); //指向每一行首地址for (int j = 0; j < src_gray.cols; j++){p[j] = 255 - p[j]; //反差處理}}
}
2、迭代器訪問
迭代器逐像素訪問
//方式2:迭代器操作(逐像素訪問)
void Iterator()
{//彩色圖//獲取迭代器Mat_<Vec3b>::iterator it1 = src.begin<Vec3b>(); //初始位置的迭代器Mat_<Vec3b>::iterator itend1 = src.end<Vec3b>(); //終止位置的迭代器//彩色圖逐像素操作for ( ; it1 != itend1; it1++) //逐像素{(*it1)[0] = 255 - (*it1)[0]; //逐通道(*it1)[1] = 255 - (*it1)[1]; //逐通道(*it1)[2] = 255 - (*it1)[2]; //逐通道}//灰度圖//獲取迭代器Mat_<uchar>::iterator it2 = src_gray.begin<uchar>(); //初始位置的迭代器Mat_<uchar>::iterator itend2 = src_gray.end<uchar>(); //終止位置的迭代器//灰度圖逐像素操作for (; it2 != itend2; it2++){(*it2) = 255 - (*it2);}
}
3、at()函數(shù)訪問
at()函數(shù)逐像素訪問
//方式3:at()函數(shù)操作(逐像素訪問)
void At()
{//彩色圖for (int i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++) //逐像素{src.at<Vec3b>(i, j)[0] = 255 - (int)src.at<Vec3b>(i, j)[0]; //逐通道src.at<Vec3b>(i, j)[1] = 255 - (int)src.at<Vec3b>(i, j)[1]; //逐通道src.at<Vec3b>(i, j)[2] = 255 - (int)src.at<Vec3b>(i, j)[2]; //逐通道}}//灰度圖for (int i = 0; i < src_gray.rows; i++){for (int j = 0; j < src_gray.cols; j++){src_gray.at<uchar>(i, j) = 255 - (int)src_gray.at<uchar>(i, j);}}
}
總代碼
//圖像像素的三種訪問方式(指針、迭代器、at()函數(shù))
//指針:逐通道訪問 迭代器:逐像素訪問 at()函數(shù):逐通道訪問
#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;Mat src, src_gray;//圖像初始化
void Image_Init()
{src = imread("Resource/test.jpg"); //讀取if (src.empty()){printf("could not load the picture...");}cvtColor(src, src_gray, COLOR_RGB2GRAY);
}//方式1:指針操作(逐通道訪問)
void Handle_Ptr()
{uchar* p;//彩圖for (int i = 0; i < src.rows; i++){p = src.ptr<uchar>(i); //指向每一行首地址for (int j = 0; j < src.cols * src.channels(); j++){p[j] = 255 - p[j]; //反差處理(逐通道)}}//灰度圖for (int i = 0; i < src_gray.rows; i++){p = src_gray.ptr<uchar>(i); //指向每一行首地址for (int j = 0; j < src_gray.cols; j++){p[j] = 255 - p[j]; //反差處理(逐通道)}}
}//方式2:迭代器操作(逐像素訪問)
void Iterator()
{//彩色圖//獲取迭代器Mat_<Vec3b>::iterator it1 = src.begin<Vec3b>(); //初始位置的迭代器Mat_<Vec3b>::iterator itend1 = src.end<Vec3b>(); //終止位置的迭代器//彩色圖逐像素操作for ( ; it1 != itend1; it1++) //逐像素{(*it1)[0] = 255 - (*it1)[0]; //逐通道(*it1)[1] = 255 - (*it1)[1]; //逐通道(*it1)[2] = 255 - (*it1)[2]; //逐通道}//灰度圖//獲取迭代器Mat_<uchar>::iterator it2 = src_gray.begin<uchar>(); //初始位置的迭代器Mat_<uchar>::iterator itend2 = src_gray.end<uchar>(); //終止位置的迭代器//灰度圖逐像素操作for (; it2 != itend2; it2++){(*it2) = 255 - (*it2);}
}//方式3:at()函數(shù)操作(逐像素訪問)
void At()
{//彩色圖for (int i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++) //逐像素{src.at<Vec3b>(i, j)[0] = 255 - (int)src.at<Vec3b>(i, j)[0]; //逐通道src.at<Vec3b>(i, j)[1] = 255 - (int)src.at<Vec3b>(i, j)[1]; //逐通道src.at<Vec3b>(i, j)[2] = 255 - (int)src.at<Vec3b>(i, j)[2]; //逐通道}}//灰度圖for (int i = 0; i < src_gray.rows; i++){for (int j = 0; j < src_gray.cols; j++){src_gray.at<uchar>(i, j) = 255 - (int)src_gray.at<uchar>(i, j);}}
}//顯示圖像
void Image_Show()
{imshow("彩圖", src);imshow("灰度圖", src_gray);
}int main()
{Image_Init(); //圖像初始化//Handle_Ptr(); //1、指針操作//Iterator(); //2、迭代器操作At(); //3、at()函數(shù)操作Image_Show(); //顯示圖像waitKey(0);return 0;
}
效果
?
參考資料
https://blog.csdn.net/zhu_hongji/article/details/81333200
總結(jié)
以上是生活随笔為你收集整理的OpenCV(总结篇)图像逐像素访问(三种操作:指针、迭代器、at()函数)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构与算法(8-1)顺序表查找及优化
- 下一篇: OpenCV(十)ROI感兴趣区域