日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Opencv3编程入门学习笔记(三)之访问图像像素的三种方法

發布時間:2023/12/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Opencv3编程入门学习笔记(三)之访问图像像素的三种方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

訪問圖像像素的三種方法:指針訪問,迭代器訪問,動態地址訪問。訪問最快的為指針訪問,以下算法在幾毫秒,但指針訪問容易造成內存泄漏;其次為迭代器訪問;最后為動態地址訪問。
以下程序是根據《OpenCV3編程入門》一書5.1.5訪問圖像中像素的三類方法,在VS2013使用OpenCV3.0編程完成的指針、迭代器、動態地址三類像素訪問方式編寫的案例程序。代碼為上述書目中的源碼,被筆者分別封裝在三個函數之內,作為學習筆記,以便日后查閱。

#include <opencv2\opencv.hpp> #include <iostream>using namespace cv; using namespace std;//迭代器訪問像素 void colorReduce_Iterator(Mat& srcImage, Mat& outImage, int div) {outImage = srcImage.clone();Mat_<Vec3b>::iterator it = outImage.begin<Vec3b>();//初始位置迭代器Mat_<Vec3b>::iterator itend = outImage.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_Point(Mat& srcImage, Mat& outImage, int div) {outImage = srcImage.clone();int rowNumber = outImage.rows;int colNumber = outImage.cols*outImage.channels();for (int i = 0; i < rowNumber; i++){uchar* data = outImage.ptr<uchar>(i);for (int j = 0; j < colNumber; j++){//------------開始處理每個像素-----------data[j] = data[j] / div*div + div / 2;}}} //動態地址訪問像素 void colorReduce_At(Mat& srcImage, Mat& outImage, int div) {outImage = srcImage.clone();int rowNumber = outImage.rows;int colNumber = outImage.cols;for (int i = 0; i < rowNumber; i++){for (int j = 0; j < colNumber; j++){//------------開始處理每個像素-----------outImage.at<Vec3b>(i, j)[0] = outImage.at<Vec3b>(i, j)[0] / div *div + div / 2;//channel0outImage.at<Vec3b>(i, j)[1] = outImage.at<Vec3b>(i, j)[1] / div *div + div / 2;//channel1outImage.at<Vec3b>(i, j)[2] = outImage.at<Vec3b>(i, j)[2] / div *div + div / 2;//channel2}} }void main() {Mat srcImage = imread("lenna.png");imshow("【原始圖像】", srcImage);Mat dstImage;dstImage.create(srcImage.rows, srcImage.cols, srcImage.type());//記錄起始時間double time0 = static_cast<double>(getTickCount());//colorReduce_At(srcImage, dstImage, 32);colorReduce_Point(srcImage, dstImage, 32);//colorReduce_Iterator(srcImage, dstImage, 32);//計算運行時間并輸出time0 = ((double)getTickCount() - time0) / getTickFrequency();cout << "此方法運行時間為:" << time0 << "秒" << endl;imshow("【目標圖】", dstImage);waitKey(0); }

實驗運行原圖

實驗像素處理后的目標圖(三種方式處理后的目標圖效果相同)

三種方式處理耗費時間
【指針】

【迭代器】

【動態地址】

總結

以上是生活随笔為你收集整理的Opencv3编程入门学习笔记(三)之访问图像像素的三种方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。