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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

OpenCV学习笔记(七):访问图像中像素的三类方法

發布時間:2024/9/21 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV学习笔记(七):访问图像中像素的三类方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

該文章參考毛星云著《OpenCV3編程入門》,電子工業出版社。


圖像是以像素為單位儲存的,訪問圖像中的每個像素是處理圖像的基礎,一般有三種訪問圖像像素的方法:


方法一:指針訪問:C操作符[ ]

方法二:迭代器iterator

方法三:動態地址計算


下面直接上代碼,代碼的目的是減少圖像的顏色種類數,即減少顏色的細分。


[cpp]?view plaincopy
  • #include<opencv2/opencv.hpp>??
  • #include<iostream>??
  • ??
  • using?namespace?cv;??
  • using?namespace?std;??
  • ??
  • void?colorreduce(Mat&?inputImage,?Mat&?outputImage,?int?div);??
  • ??
  • int?main()??
  • {??
  • ????Mat?srcimage?=?imread("1.jpg");??
  • ????imshow("srcimage",?srcimage);??
  • ??
  • ????Mat?dstimage;??
  • ????dstimage.create(srcimage.rows,?srcimage.cols,?srcimage.type());??
  • ??????
  • ????double?time0?=?static_cast<double>(getTickCount());??
  • ??
  • ????colorreduce(srcimage,?dstimage,?32);??
  • ??
  • ????time0?=?((double)getTickCount()?-?time0)?/?getTickFrequency();??
  • ????cout?<<?"Time?=?"?<<?time0?<<?"seconds"?<<?endl;??
  • ????imshow("dstimage",?dstimage);??
  • ????waitKey(0);??
  • }??
  • ??
  • 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);?//獲取行地址??
  • ????????for?(int?j?=?0;?j?<?colNumber;?j++)??
  • ????????{??
  • ????????????data[j]?=?data[j]?/?div*div?+?div?/?2;??
  • ????????}??
  • ????????//*data++?=?*data?/?div*div?+?div?/?2;?//所有方法中最快的??
  • ????}??
  • ??
  • ??
  • ????/*??
  • ????//方法二:迭代器??
  • ????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;??
  • ????}??
  • ????*/??
  • ??
  • ????/*?
  • ????//方法三:動態地址計算?
  • ????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;?
  • ????????}?
  • ????}?
  • ????*/??
  • }??

  • 程序運行的效果如下:






    從結果上看,減小顏色種類后,圖像變得更模糊了。


    在程序中,需要注意的是colorreduce函數的形參是Mat&,而不是Mat,這是C++的知識,因為需要傳入函數的圖片在主函數中也發生變化,即函數外部的數據隨函數內部的操作而變化。

    版權聲明:本文為博主原創文章,未經博主允許不得用于商業轉載。 https://blog.csdn.net/wangxuwen2/article/details/52091827

    總結

    以上是生活随笔為你收集整理的OpenCV学习笔记(七):访问图像中像素的三类方法的全部內容,希望文章能夠幫你解決所遇到的問題。

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