1. 程式人生 > >openCV--訪問影象畫素的三個方法

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

  • 方法一       指標訪問:C操作符[ ]
  • 方法二       迭代器iterater
  • 方法三        動態地址計算

訪問速度上,debug模式下 ,方法一 > 方法二 > 方法三

1. 方法1: 先獲取行首地址,之後計算列數,按每行的首地址遞增列數訪問

\large n_r = cols*n\_channels


	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;  //紅是通道
			// -------------------------【處理結束】----------------------------
		}  // 行處理結束     
	}