OpenCV 像素存储
生活随笔
收集整理的這篇文章主要介紹了
OpenCV 像素存储
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
像素存儲
OpenCV 中圖像矩陣的大小取決于所用的顏色模型,更準確的說是取決于圖像所用到的通道數。
如果使用的是灰度圖,矩陣大概如圖所示:
如果使用的是多通道的圖像,矩陣中的列會包含多個子列,子列的個數和通道數相等。例如 RGB 顏色模型的矩陣大致如下圖所示:
很多情況下,因為內存足夠大,可以實現連續存儲,因此圖像中的各行能夠一行一行的連接起來,形成一個長行。連續存儲有助于提升圖像掃描速度,我們可以使用 isContinuous 來判斷矩陣是不是連續存儲的。
簡單示例
下面模擬實現減少圖像顏色的操作
// ---------------------【 colorReduce() 函數 】------------------
// 描述:使用【指針訪問:C操作符[]】方法版的顏色空間縮減函數
// --------------------------------------------------------------
void colorReduce (Mat& inputImage, Mat& outputImage, int div)
{// 參數準備outputImage = inputImage.clone()j;int rowNumber = outputImage.rows(); // 行號int colNumber = outputImage.clos * outputImage.channels(); // 列數 * 通道數 = 每一行元素的個數// 雙重循環,遍歷所有的元素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;}}
}
Mat 類有若干成員函數,可以獲取到圖像的屬性。公有成員函數變量 cols 和 rows 給出了圖像大的寬和高,而成員函數 channels() 用于返回圖像的通道數。灰度圖的通道數是 1,彩色圖的通道數是3.
以上示例還可以使用迭代器的方式實現
void colorReduce (Mat& inputImage, Mat& outputImage, int div)
{// 參數準備outputImage = inputImage.clone();// 獲取迭代器Mat_<Vec3d>::iterator it = outputImage.begin<Vec3d>(); // 初始位置Mat_<Vec3d>::iterator itend = outputImage.end<Vec3d>()' // 結束位置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;}
}
總結
以上是生活随笔為你收集整理的OpenCV 像素存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 私人教练多少钱啊?
- 下一篇: OpenC 仿射变换