OpenCV訪問Mat中每個畫素的值
寫的很好,我就轉來了,不錯。
方法零:.ptr和[]操作符
Mat最直接的訪問方法是通過.ptr<>函式得到一行的指標,並用[]操作符訪問某一列的畫素值。
- // using .ptr and []
- void colorReduce0(cv::Mat &image, int div=64) {
- int nr= image.rows; // number of rows
- int nc= image.cols * image.channels(); // total number of elements per line
-
for
- uchar* data= image.ptr<uchar>(j);
- for (int i=0; i<nc; i++) {
- data[i]= data[i]/div*div + div/2;
- }
- }
- }
方法一:.ptr和指標操作
除了[]操作符,我們可以移動指標*++的組合方法訪問某一行中所有畫素的值。
-
// using .ptr and * ++
- void colorReduce1(cv::Mat &image, int div=64) {
- int nr= image.rows; // number of rows
- int nc= image.cols * image.channels(); // total number of elements per line
- for (int j=0; j<nr; j++) {
- uchar* data= image.ptr<uchar>(j);
-
for (int i=0; i<nc; i++) {
- *data++= *data/div*div + div/2;
- } // end of row
- }
- }
方法二:.ptr、指標操作和取模運算
方法二和方法一的訪問方式相同,不同的是color reduce用模運算代替整數除法
- // using .ptr and * ++ and modulo
- void colorReduce2(cv::Mat &image, int div=64) {
- int nr= image.rows; // number of rows
- int nc= image.cols * image.channels(); // total number of elements per line
- for (int j=0; j<nr; j++) {
- uchar* data= image.ptr<uchar>(j);
- for (int i=0; i<nc; i++) {
- int v= *data;
- *data++= v - v%div + div/2;
- } // end of row
- }
- }
方法三:.ptr、指標運算和位運算
由於進行量化的單元div通常是2的整次方,因此所有的乘法和除法都可以用位運算表示。
- // using .ptr and * ++ and bitwise
- void colorReduce3(cv::Mat &image, int div=64) {
- int nr= image.rows; // number of rows
- int nc= image.cols * image.channels(); // total number of elements per line
- int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));
- // mask used to round the pixel value
- uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0
- for (int j=0; j<nr; j++) {
- uchar* data= image.ptr<uchar>(j);
- for (int i=0; i<nc; i++) {
- *data++= *data&mask + div/2;
- } // end of row
- }
- }
方法四:指標運算
方法四和方法三量化處理的方法相同,不同的是用指標運算代替*++操作。
- // direct pointer arithmetic
- void colorReduce4(cv::Mat &image, int div=64) {
- int nr= image.rows; // number of rows
- int nc= image.cols * image.channels(); // total number of elements per line
- int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));
- int step= image.step; // effective width
- // mask used to round the pixel value
- uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0
- // get the pointer to the image buffer
- uchar *data= image.data;
- for (int j=0; j<nr; j++) {
- for (int i=0; i<nc; i++) {
- *(data+i)= *data&mask + div/2;
- } // end of row
- data+= step; // next line
- }
- }
方法五:.ptr、*++、位運算以及image.cols * image.channels()
這種方法就是沒有計算nc,基本是個充數的方法。
- // using .ptr and * ++ and bitwise with image.cols * image.channels()
- void colorReduce5(cv::Mat &image, int div=64) {
- int nr= image.rows; // number of rows
- int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));
- // mask used to round the pixel value
- uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0
- for (int j=0; j<nr; j++) {
- uchar* data= image.ptr<uchar>(j);
- for (int i=0; i<image.cols * image.channels(); i++) {
- *data++= *data&mask + div/2;
- } // end of row
- }
- }
方法六:連續影象
Mat提供了isContinuous()函式用來檢視Mat在記憶體中是不是連續儲存,如果是則圖片被儲存在一行中。
- // using .ptr and * ++ and bitwise (continuous)
- void colorReduce6(cv::Mat &image, int div=64) {
- int nr= image.rows; // number of rows
- int nc= image.cols * image.channels(); // total number of elements per line
- if (image.isContinuous()) {
- // then no padded pixels
- nc= nc*nr;
- nr= 1; // it is now a 1D array
- }
- int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));
- // mask used to round the pixel value
- uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0
- for (int j=0; j<nr; j++) {
-
相關推薦
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"
關於opencv的Mat型別的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。將*操作符新增在迭代指標前,即可訪問當前指向的內容。相比於指標直接訪問可能出現越界問題,迭代器絕對 是非常安全的方法。用關鍵字