1. 程式人生 > >opencv中對影象畫素點訪問的三種方法利用程式進行解讀

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

程式碼放到自己的工程中,執行就可以的
#include <opencv2\opencv.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include
using namespace std;
using namespace cv;
//用指標訪問畫素是最常用的方法,處理速度快,時間短。
void colorReduce(Mat& inputImage,Mat& outputImage,int div)
{
outputImage=inputImage.clone();
int rowNumber=outputImage.rows;
int colNumber=outputImage.colsoutputImage.channels();//列數乘以通道數等於每一行元素的個數
//遍歷每一個元素
for(int i=0;i<rowNumber;i++)//行數的迴圈
{
uchar

data=outputImage.ptr(i);//獲取第i行的首地址接下來就可以用data訪問每一行
for(int j=0;j<colNumber;j++)
{
//開始處理每個畫素點的三通道
data[j]=data[j]/divdiv+div/2;
}
}
}
//用迭代器操作畫素我們僅僅只需要獲取影象矩陣的begin和end,將迭代指標前新增
既可以訪問當前指向的內容
void colorReduce(Mat& inputImage,Mat& outputImage,int div)
{
outputImage=inputImage.clone();
Mat_::iterator it=outputImage.begin();//初始位置的迭代器
Mat_::iterator itend=outputImage.end();//終止位置的迭代器
//儲存彩色影象的畫素
for(;it !=itend;it++){
(it)[0] = (it)[0]/div
div+div/2; // B藍色通道
(it)[1]=(it)[1]/divdiv+div/2; // G綠色通道
(it)[2]=(it)[2]/divdiv+div/2; //R紅色通道
}
} //處理的速度慢,在三種遍歷中的處理速度是最慢的。
//動態地址計算,動態地址運算配合at方法的colorReduce函式的程式碼
void colorReduce(Mat& inputImage,Mat& outputImage,int div)
{
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
(i,j)[0] = outputImage.at(i,j)[0]/div
div+div/2; //獲取藍色通道並進行相關運算
outputImage.at(i,j)[1]=outputImage.at(i,j)[1]/div
div+div/2; //獲取綠色通道並進行相關運算
outputImage.at(i,j)[2]=outputImage.at(i,j)[2]/div
div+div/2; //獲取紅色通道並進行相關運算
}
}//遍歷影象元素的方法有很多種可以進行封裝起來直接呼叫
}
int main()
{
Mat img1=imread(“1.jpg”);
imshow(“原始影象”,img1);//以後要注意力在顯示一幅影象要想長期懸掛的話一定要配上語句waitKey(0)
Mat dstImage;
dstImage.create(img1.rows,img1.cols,img1.type());
//效果圖的大小,型別和原圖片相同
double time0=static_cast(getTickCount());
// colorReduce(img1,dstImage,32);
colorReduce(img1,dstImage,32);
time0=((double)getTickCount()-time0)/getTickFrequency();
cout<<“對一幅圖片的畫素處理的時間為”<<endl<<time0<<endl<<“秒”<<endl;
imshow(“顏色空間縮減的圖片”,dstImage); //很明顯顏色空間縮減的圖片與原圖相比會有點失真的現象
waitKey(0);
}

以上三種對影象中畫素點的訪問演算法的複雜度是不同的,所以,自己可以用opencv中帶的時間來函式來計算一下,驗證下哪種演算法是最好的!!

成功的路上有CSDN陪伴不會孤獨!