openCV--訪問影象畫素的三個方法
阿新 • • 發佈:2018-12-19
- 方法一 指標訪問:C操作符[ ]
- 方法二 迭代器iterater
- 方法三 動態地址計算
訪問速度上,debug模式下 ,方法一 > 方法二 > 方法三
1. 方法1: 先獲取行首地址,之後計算列數,按每行的首地址遞增列數訪問
int rowNumber = outputImage.rows; //行數 int colNumber = outputImage.cols*outputImage.channels(); //列數 x 通道數=每一行元素的個數 //雙重迴圈,遍歷所有的畫素值 for(int i = 0;i < rowNumber;i++) //行迴圈 { uchar* data = outputImage.ptr<uchar>(i); //獲取第i行的首地址 for(int j = 0;j < colNumber;j++) //列迴圈 { // ---------【開始處理每個畫素】------------- data[j] = data[j]/div*div + div/2; // ----------【處理結束】--------------------- } //行處理結束 }
2. 方法2 迭代器iterater:用指標訪問可能會出現越界問題,迭代器相較於指標要安全
outputImage = inputImage.clone(); //拷貝實參到臨時變數 //獲取迭代器 Mat_<Vec3b>::iterator it = outputImage.begin<Vec3b>(); //初始位置的迭代器 Mat_<Vec3b>::iterator itend = outputImage.end<Vec3b>(); //終止位置的迭代器 //存取彩色影象畫素 for(;it != itend;++it) { // ------------------------【開始處理每個畫素】-------------------- (*it)[0] = (*it)[0]/div*div + div/2; (*it)[1] = (*it)[1]/div*div + div/2; (*it)[2] = (*it)[2]/div*div + div/2; // ------------------------【處理結束】---------------------------- }
3. 方法三 動態地址計算
outputImage = inputImage.clone(); //拷貝實參到臨時變數 int rowNumber = outputImage.rows; //行數 int colNumber = outputImage.cols; //列數 //存取彩色影象畫素 for(int i = 0;i < rowNumber;i++) { for(int j = 0;j < colNumber;j++) { // ------------------------【開始處理每個畫素】-------------------- outputImage.at<Vec3b>(i,j)[0] = outputImage.at<Vec3b>(i,j)[0]/div*div + div/2; //藍色通道 outputImage.at<Vec3b>(i,j)[1] = outputImage.at<Vec3b>(i,j)[1]/div*div + div/2; //綠色通道 outputImage.at<Vec3b>(i,j)[2] = outputImage.at<Vec3b>(i,j)[2]/div*div + div/2; //紅是通道 // -------------------------【處理結束】---------------------------- } // 行處理結束 }