opencv技術訪問圖像中的像素

計時函數
1、getTickCount()函數返回CPU自某個事件以來走過的時鐘週期數
2、getTickFreQuency()函數返回CPU一秒鐘所走過的時鐘週期數。
實例如下:
double time0=static_cast(getTickCount());//記錄起始時間
//進行圖像處理操作。。。。。。
time0=((double)getTickCount()-time0)/getTickFrequency();
cout<<”此方法運行時間是”<

#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void colorReduce(Mat& inputImage, Mat& outputImage, int div);
//用指針訪問像素
void colorReduce(Mat& inputImage, Mat& outputImage, int div)
{
outputImage=inputImage.clone();//複製實參到臨時變量
int rowNumber=outputImage.rows;
int colNumber=outputImage.cols*outputImage.channels();
//列數*通道數=每一行元素的個數
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;
}
}
}
/*
//用迭代器操作像素
void colorReduce(Mat& inputImage, Mat& outputImage, int div)
{
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;
}
}
*/
/*
//動態地址計算
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<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;//紅素通道
        }
    }
}
*/
int main()
{
    //創建原始圖並顯示
    Mat srcImage = imread("1.jpg");
    imshow("原始圖像", srcImage);
    //按原圖的參數規格來創建效果圖
    Mat dstImage;
    dstImage.create(srcImage.cols, srcImage.rows, srcImage.type());
    //記錄起始時間
    double time0 = static_cast<double>(getTickCount());
    colorReduce(srcImage,dstImage,32);
    time0 = ((double)getTickCount() - time0) / getTickFrequency();
    cout << "此方法運行時間是" << time0 << "秒" << endl;
    imshow("【效果圖】", dstImage);
    waitKey(0);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章