1. 程式人生 > >OpenCV訪問Mat中每個畫素的值

OpenCV訪問Mat中每個畫素的值

寫的很好,我就轉來了,不錯。

方法零:.ptr和[]操作符

Mat最直接的訪問方法是通過.ptr<>函式得到一行的指標,並用[]操作符訪問某一列的畫素值。

  1. // using .ptr and []
  2. void colorReduce0(cv::Mat &image, int div=64) {  
  3.       int nr= image.rows; // number of rows
  4.       int nc= image.cols * image.channels(); // total number of elements per line
  5.       for
     (int j=0; j<nr; j++) {  
  6.           uchar* data= image.ptr<uchar>(j);  
  7.           for (int i=0; i<nc; i++) {  
  8.                   data[i]= data[i]/div*div + div/2;  
  9.             }                    
  10.       }  
  11. }  


方法一:.ptr和指標操作

除了[]操作符,我們可以移動指標*++的組合方法訪問某一行中所有畫素的值。

  1. // using .ptr and * ++ 
  2. void colorReduce1(cv::Mat &image, int div=64) {  
  3.       int nr= image.rows; // number of rows
  4.       int nc= image.cols * image.channels(); // total number of elements per line
  5.       for (int j=0; j<nr; j++) {  
  6.           uchar* data= image.ptr<uchar>(j);  
  7.           for (int i=0; i<nc; i++) {  
  8.                  *data++= *data/div*div + div/2;  
  9.             } // end of row                 
  10.       }  
  11. }  


方法二:.ptr、指標操作和取模運算

方法二和方法一的訪問方式相同,不同的是color reduce用模運算代替整數除法

  1. // using .ptr and * ++ and modulo
  2. void colorReduce2(cv::Mat &image, int div=64) {  
  3.       int nr= image.rows; // number of rows
  4.       int nc= image.cols * image.channels(); // total number of elements per line
  5.       for (int j=0; j<nr; j++) {  
  6.           uchar* data= image.ptr<uchar>(j);  
  7.           for (int i=0; i<nc; i++) {  
  8.                   int v= *data;  
  9.                   *data++= v - v%div + div/2;  
  10.             } // end of row                 
  11.       }  
  12. }  


方法三:.ptr、指標運算和位運算

由於進行量化的單元div通常是2的整次方,因此所有的乘法和除法都可以用位運算表示。

  1. // using .ptr and * ++ and bitwise
  2. void colorReduce3(cv::Mat &image, int div=64) {  
  3.       int nr= image.rows; // number of rows
  4.       int nc= image.cols * image.channels(); // total number of elements per line
  5.       int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));  
  6.       // mask used to round the pixel value
  7.       uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0
  8.       for (int j=0; j<nr; j++) {  
  9.           uchar* data= image.ptr<uchar>(j);  
  10.           for (int i=0; i<nc; i++) {  
  11.             *data++= *data&mask + div/2;  
  12.             } // end of row                 
  13.       }  
  14. }  


方法四:指標運算

方法四和方法三量化處理的方法相同,不同的是用指標運算代替*++操作。

  1. // direct pointer arithmetic
  2. void colorReduce4(cv::Mat &image, int div=64) {  
  3.       int nr= image.rows; // number of rows
  4.       int nc= image.cols * image.channels(); // total number of elements per line
  5.       int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));  
  6.       int step= image.step; // effective width
  7.       // mask used to round the pixel value
  8.       uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0
  9.       // get the pointer to the image buffer
  10.       uchar *data= image.data;  
  11.       for (int j=0; j<nr; j++) {  
  12.           for (int i=0; i<nc; i++) {  
  13.             *(data+i)= *data&mask + div/2;  
  14.             } // end of row                 
  15.             data+= step;  // next line
  16.       }  
  17. }  


方法五:.ptr、*++、位運算以及image.cols * image.channels()

這種方法就是沒有計算nc,基本是個充數的方法。

  1. // using .ptr and * ++ and bitwise with image.cols * image.channels()
  2. void colorReduce5(cv::Mat &image, int div=64) {  
  3.       int nr= image.rows; // number of rows
  4.       int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));  
  5.       // mask used to round the pixel value
  6.       uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0
  7.       for (int j=0; j<nr; j++) {  
  8.           uchar* data= image.ptr<uchar>(j);  
  9.           for (int i=0; i<image.cols * image.channels(); i++) {  
  10.             *data++= *data&mask + div/2;  
  11.             } // end of row                 
  12.       }  
  13. }  

方法六:連續影象

Mat提供了isContinuous()函式用來檢視Mat在記憶體中是不是連續儲存,如果是則圖片被儲存在一行中。

  1. // using .ptr and * ++ and bitwise (continuous)
  2. void colorReduce6(cv::Mat &image, int div=64) {  
  3.       int nr= image.rows; // number of rows
  4.       int nc= image.cols * image.channels(); // total number of elements per line
  5.       if (image.isContinuous())  {  
  6.           // then no padded pixels
  7.           nc= nc*nr;   
  8.           nr= 1;  // it is now a 1D array
  9.        }  
  10.       int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));  
  11.       // mask used to round the pixel value
  12.       uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0
  13.       for (int j=0; j<nr; j++) {  
  14. 相關推薦

    OpenCV訪問Mat每個

    寫的很好,我就轉來了,不錯。 方法零:.ptr和[]操作符 Mat最直接的訪問方法是通過.ptr<>函式得到一行的指標,並用[]操作符訪問某一列的畫素值。 // using .ptr and [] void colorRed

    OpenCV訪問Mat影象每個

    轉載自https://blog.csdn.net/warrenwg/article/details/48056363 優化C++和OpenCv過程中,總結的若干技巧如下:  1 訪問Opencv的Mat格式時,需要注意訪問方式,其中使用C語言的【】操作符訪問最快,使用.At<&g

    OpenCV取影象每個

    import cv2import numpy as pydef salt(img): IMAGE_FILE = img img = cv2.imread(IMAGE_FILE) print(img.shape[1]) for i in

    OpenCV訪問影象

    OpenCV影象處理運算元都是一個函式。 作用: 接受一個輸入或多個輸入,產生輸出影象。 格式: g(x)=f(h(x))//單個輸入, 或 g(x)=f(h0(x),h1(x),...,hn(x))//多個輸入 影象處理變換中典型的操作:點操作 點操作: 影象亮度和對

    《OpenCV3程式設計入門》——5.1 訪問影象

    目錄 1、影象在記憶體之中的儲存方式 2、顏色空間縮減 3、LUT函式:Look up table操作 4、計時函式 5、訪問影象中畫素的三類方法         5.1、指標訪問畫素       &n

    《OpenCV3程式設計入門》——5.1 訪問影象--計時函式

    計時函式: 簡便的計時函式:getTickCount()和get TickFrequency() getTickCount()函式:返回CPU自某個事件以來走過的時鐘週期數 getTickFrequency()函式:返回CPU一秒鐘所走的時鐘週期數。這樣,就能以秒為單位對某運算計時。

    《OpenCV3程式設計入門》——5.1 訪問影象--顏色空間縮減及LUT函式:Look up table操作

    1、顏色空間縮減 顏色空間縮減的做法是:將現有顏色空間值除以某個輸入值,以獲得較少的顏色數。即做減法,比如顏色值0到9可取為新值0,10到19可取為10,以此類推。 有一個簡單的公式來實現顏色空間縮減: 在處理畫素時,每個畫素需要進行一遍上述公式計算,也需要一定的時間花銷。我們可以把25

    《OpenCV3程式設計入門》——5.1 訪問影象--影象在記憶體之中的儲存方式

    影象在記憶體之中的儲存方式: 影象矩陣的大小取決於所用的顏色模型,確切說,取決於所用通道數。如果是灰度影象,矩陣就會如圖5.1所示。 對於多通道影象來說,矩陣中的列會包含多個子列,其子列個數與通道數相同,如圖5.2所示RGB顏色模型的矩陣。 可以看到,OpenCV中子列的通道

    【Python+OpenCV】圖片區域性區域處理(改進版)-一種特徵提取方法

    上一個版本看這裡:《Python+OpenCV實現【圖片】區域性區域畫素值處理》 上個版本的程式碼雖然實現了我需要的功能,但還是走了很多彎路,我意識到圖片本就是陣列形式,對於8位灰度圖,通道數為1,它

    Opencv獲取影象上的(Ubuntu版)

    前言:當需要製作自己的訓練集的時候,標註圖片上的檢測目標,是一件比較耗時費力的事情。下面記錄的就是其中一種方法。 1.程式碼: import argparse import cv2 refPt=[] cropping=False def click_and_crop(e

    【Python+OpenCV】視訊流區域性區域處理-一種特徵提取方法

    開發環境:Python3.6.0 + OpenCV3.2.0 任務目標:攝像頭採集影象(例如:480*640),並對視訊流每一幀(灰度圖)特定矩形區域(480*30)畫素值進行行求和,得到一個48

    OpenCV計算機視覺之訪問

    #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgpro

    opencv讀取彩色/灰度圖片並存儲在本地檔案c++程式碼例項及執行結果

    c++程式碼彩色圖片#include<opencv2/opencv.hpp> #include<fstream> using namespace std; using namespace cv; int main(int argc, char* ar

    opencv 通過指標訪問影象,輸出為空的問題

    for (int i = 0; i < img_roi_gray_at.rows; ++i) { uchar* datatemp = img_roi_gray_at.ptr<uchar>(i);

    關於OpenCV Mat讀取

    最近開始使用OPenCV讀取影象畫素值,並做處理,裁剪出ROI區域,並做儲存。 對於Mat類生成的物件,包含諸多屬性,Mat.rows, Mat.cols分別表示影象的heighten和width屬性。 Mat的座標系從左上角(0,0)開始,到右下角(Mat.rows, M

    OpenCV--讀取影象任意點的,並顯示座標

    需求:在滑鼠左鍵按下時,顯示該位置的畫素值和座標。 在vs2010下新建了Win32控制檯專案,在此只處理灰度影象,顯示的畫素值為灰度值 #include "iostream"

    關於opencvMat型別的imwrite()函式寫入.jpg影象會改變的解決方案

     #include <string> #include <opencv2/opencv.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace std; using na

    OpenCV訪問影象並修改--IplImage

    1.IplImage的結構: typedef struct _IplImage { int nSize; /* IplImage大小 */

    OpenCV讀取影象

    OpenCV中用於讀取影象畫素點的值的方法很多,這裡主要提供了兩種常用的方法。 方法一 利用IplImage資料型別的imageData定位資料緩衝區來實現,imageData包含指向影象第一個畫素資料的指標 例: If( imgSource != 0 )//imgSource為IplImage* { fo

    opencv訪問圖片的方法(二)——迭代器iterator

    opencv訪問圖片畫素的第二種方法為:迭代法。在迭代法中,我們所需要的僅僅是獲得矩陣的begin和end,然後增加迭代直至 從begin到end。將*操作符新增在迭代指標前,即可訪問當前指向的內容。相比於指標直接訪問可能出現越界問題,迭代器絕對 是非常安全的方法。用關鍵字