1. 程式人生 > >opencv訪問影象畫素

opencv訪問影象畫素




(1) 假設你要訪問第k通道、第i行、第j列的畫素。


(2) 間接訪問: (通用,但效率低,可訪問任意格式的影象)


對於單通道位元組型影象:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
CvScalar s;
s=cvGet2D(img,i,j); // get the (j,i) pixel value, 注意cvGet2D與cvSet2D中座標引數的順序與其它opencv函式座標引數順序恰好相反.本函式中i代表y軸,即height;j代表x軸,即weight.
printf("intensity=%f\n",s.val[0]);
s.val[0]=111;
cvSet2D(img,i,j,s); // set the (j,i) pixel value
對於多通道位元組型/浮點型影象:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
CvScalar s;
s=cvGet2D(img,i,j); // get the (i,j) pixel value
printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]);
s.val[0]=111;
s.val[1]=111;
s.val[2]=111;
cvSet2D(img,i,j,s); // set the (i,j) pixel value
(3) 直接訪問: (效率高,但容易出錯)


對於單通道位元組型影象:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
((uchar *)(img->imageData + i*img->widthStep))[j]=111;
對於多通道位元組型影象:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B
((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G
((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R
對於多通道浮點型影象:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B
((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G
((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R
(4) 基於指標的直接訪問: (簡單高效)


對於單通道位元組型影象:
IplImage* img  = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
int height     = img->height;
int width      = img->width;
int step       = img->widthStep/sizeof(uchar);
uchar* data    = (uchar *)img->imageData;
data[i*step+j] = 111;
對於多通道位元組型影象:
IplImage* img  = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
int height     = img->height;
int width      = img->width;
int step       = img->widthStep/sizeof(uchar);
int channels   = img->nChannels;
uchar* data    = (uchar *)img->imageData;
data[i*step+j*channels+k] = 111;
對於多通道浮點型影象(假設影象資料採用4位元組(32位)行對齊方式):
IplImage* img  = cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
int height     = img->height;
int width      = img->width;
int step       = img->widthStep/sizeof(float);
int channels   = img->nChannels;
float * data    = (float *)img->imageData;
data[i*step+j*channels+k] = 111;
(5) 基於 c++ wrapper 的直接訪問: (更簡單高效)


首先定義一個 c++ wrapper ‘Image’,然後基於Image定義不同型別的影象:
template<class T> class Image
{
  private:
  IplImage* imgp;
  public:
  Image(IplImage* img=0) {imgp=img;}
  ~Image(){imgp=0;}
  void operator=(IplImage* img) {imgp=img;}
  inline T* operator[](const int rowIndx) {
    return ((T *)(imgp->imageData + rowIndx*imgp->widthStep));}
}; 
 
typedef struct{
  unsigned char b,g,r;
} RgbPixel; 
 
typedef struct{
  float b,g,r;
} RgbPixelFloat; 
 
typedef Image<RgbPixel>       RgbImage;
typedef Image<RgbPixelFloat>  RgbImageFloat;
typedef Image<unsigned char>  BwImage;
typedef Image<float>          BwImageFloat;
對於單通道位元組型影象:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
BwImage imgA(img);
imgA[i][j] = 111;
對於多通道位元組型影象:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
RgbImage  imgA(img);
imgA[i][j].b = 111;
imgA[i][j].g = 111;
imgA[i][j].r = 111;
對於多通道浮點型影象:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
RgbImageFloat imgA(img);
imgA[i][j].b = 111;
imgA[i][j].g = 111;
imgA[i][j].r = 111;

相關推薦

openCV--訪問影象的三個方法

方法一       指標訪問:C操作符[ ] 方法二       迭代器iterater 方法三        動態地址計算 訪問速度上,debug模式下 ,方法一 > 方法二 > 方法

opencv訪問影象

(1) 假設你要訪問第k通道、第i行、第j列的畫素。 (2) 間接訪問: (通用,但效率低,可訪問任意格式的影象) 對於單通道位元組型影象: IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); CvSc

opencv訪問影象

訪問畫素的三種方法 ①指標訪問:最快 ②迭代器iterator:較慢,非常安全,指標訪問可能出現越界問題 ③動態地址計算:更慢,通過at()實現。適用於訪問具體某個第i行,j列的畫素,而不適用遍歷畫素 Mat在記憶體中儲存形式   灰度圖的儲存形式        RGB的儲存形式    一般情況下,Mat

opencv訪問影象的 三種方法

訪問畫素的三種方法 ①指標訪問:最快 ②迭代器iterator:較慢,非常安全,指標訪問可能出現越界問題 ③動態地址計算:更慢,通過at()實現。適用於訪問具體某個第i行,j列的畫素,而不適用遍歷畫素 Mat在記憶體中儲存形式   灰度圖的儲存形式        RGB的儲存形式    一般情況下,M

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

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

OpenCV訪問影象值並修改--IplImage

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

訪問影象幾種方法

#include <iostream> #include <opencv2/opencv.hpp> #include <Windows.h> #include <opencv2/highgui/highgui.hpp> using namespace

opencv讀取影象值讀取並儲存到txt檔案(二)灰度圖

#include "stdafx.h" #include"cv.h" #include <stdlib.h> #include <stdio.h> #include <math.h> #include <fstream> #include &l

opencv讀取影象值讀取並儲存到txt檔案(一)RGB

#include “stdafx.h” #include"cv.h" #include <stdlib.h> #include <stdio.h> #include <math.h> #include #include #include “iost

OpenCV——修改影象(隨心所欲)

這一節將講述OpenCV——修改影象畫素,根據自己需要新增特定的畫素部分 原圖如下,我們就是先在這個視訊流上新增一條直線段(有一定寬度的) 現在我們想新增一條,135行-455行,列350--360的直線段 #include<opencv2/opencv.hp

opencv影象進行操作

用Opencv對影象畫素進行操作大概有以下三種方式: 1. One using the Inbuilt macro 2. One using the pointer to the image data 3. Getting the raw data from the image. =============

opencv影象的讀取與顯示

讀取畫素  單通道 :  ycbr.at<uchar>(i,j) 三通道:ycbr.at<Vec3b>(i,j) 四通道:ycbr.at<Vec4b>(i,j) 返回的應該是個 <> 中引數的量,Vec3b。 無法直接顯示

opencv中對影象訪問的三種方法利用程式進行解讀

程式碼放到自己的工程中,執行就可以的 #include <opencv2\opencv.hpp> #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #includ

OpenCV學習筆記(三)之影象的提取

     提取影象的畫素及畫素索引 Mat src, dst; src = imread("mountainandwater.jpg"); //讀取影象 if (src.empty()) { qDebug()<<"can

python數字影象處理(3):影象訪問與裁剪

圖片讀入程式中後,是以numpy陣列存在的。因此對numpy陣列的一切功能,對圖片也適用。對陣列元素的訪問,實際上就是對圖片畫素點的訪問。 彩色圖片訪問方式為: img[i,j,c] i表示圖片的行數,j表示圖片的列數,c表示圖片的通道數(RGB三通道分別對應0,1

OpenCV二值化影象操作

二值化影象畫素不是0就是255,資料型別為uchar。所以訪問方法是: // 這裡inputmat是二值化影象的mat inputmat.at<uchar>(y, x); 判斷是否為白色的方法: if (inputmat.at<uchar&g

OpenCV 基於超分割的影象區域選取方法及原始碼

摳取影象區域的一個小demo,藉助影象超畫素分割的方法,將影象成子分塊,再利用種子填充演算法,選取子塊區域。 超畫素分割方法,採用論文 SEEDS: Superpixels Extracted via Energy-Driven Sampling

opencv影象值讀取

說到影象畫素,肯定要先認識一下影象中的座標系長什麼樣。 1. 座標體系中的零點座標為圖片的左上角,X軸為影象矩形的上面那條水平線;Y軸為影象矩形左邊的那條垂直線。該座標體系在諸如結構體Mat,Rect,

OpenCV影象操作及效率分析

        學習OpenCV也幾個月了,雖然對OpenCV有些瞭解,但是感覺基礎還是沒打實,在這在介紹一下OpenCV的畫素操作,以及OpenCV讀取影象的格式和讀取影象的效率分析。當然文章也有很多沒有介紹到的地方,希望大家多多指教,相互交流。         在計

Python-OpenCV 處理影象(三):影象點操作

https://segmentfault.com/a/1190000003742442 0x01. 畫素 有兩種直接操作圖片畫素點的方法: 第一種辦法就是將一張圖片看成一個多維的list,例如對於一張圖片im,想要操作第四行第四列的畫素點就直接 im[3,3] 就可以獲取到這個點的RGB值。 第二種就是