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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

OpenCV(总结篇)图像逐像素访问(三种操作:指针、迭代器、at()函数)

發(fā)布時間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV(总结篇)图像逐像素访问(三种操作:指针、迭代器、at()函数) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

概述

1、指針訪問

2、迭代器訪問

3、at()函數(shù)訪問

總代碼

效果

參考資料


概述

訪問圖像像素值是圖像處理的基本操作。OpenCV提供了很多訪問方式,比較常用的三種方式:?
(1) 通過指針訪問 (逐通道
(2) 通過迭代器訪問 (逐像素
(3) 動態(tài)地址計算,通過at()函數(shù)實現(xiàn)(逐像素

方法比較:?
(1)用指針訪問像素,速度最快;但在彩色圖像處理中,如果要單獨對某一個顏色分量處理,則需要通過數(shù)學(xué)公式計算,不是很直觀;?
(2)推薦用通過迭代器訪問像素,速度快,而且提取BGR某一顏色分量很方便。?
(3)at()函數(shù)適用于隨機訪問某個具體的像素點(已知該像素點行、列坐標(biāo)),不建議用at()函數(shù)遍歷整個圖。

1、指針訪問

指針通道訪問?

//方式1:指針操作(逐通道訪問)
void Handle_Ptr()
{uchar* p;//彩圖for (int i = 0; i < src.rows; i++){p = src.ptr<uchar>(i);				//指向每一行首地址for (int j = 0; j < src.cols * src.channels(); j++){p[j] = 255 - p[j];				//反差處理}}//灰度圖for (int i = 0; i < src_gray.rows; i++){p = src_gray.ptr<uchar>(i);				//指向每一行首地址for (int j = 0; j < src_gray.cols; j++){p[j] = 255 - p[j];					//反差處理}}
}

2、迭代器訪問

迭代器像素訪問

//方式2:迭代器操作(逐像素訪問)
void Iterator()
{//彩色圖//獲取迭代器Mat_<Vec3b>::iterator it1 = src.begin<Vec3b>();			//初始位置的迭代器Mat_<Vec3b>::iterator itend1 = src.end<Vec3b>();		//終止位置的迭代器//彩色圖逐像素操作for ( ; it1 != itend1; it1++)			//逐像素{(*it1)[0] = 255 - (*it1)[0];			//逐通道(*it1)[1] = 255 - (*it1)[1];			//逐通道(*it1)[2] = 255 - (*it1)[2];			//逐通道}//灰度圖//獲取迭代器Mat_<uchar>::iterator it2 = src_gray.begin<uchar>();		//初始位置的迭代器Mat_<uchar>::iterator itend2 = src_gray.end<uchar>();		//終止位置的迭代器//灰度圖逐像素操作for (; it2 != itend2; it2++){(*it2) = 255 - (*it2);}
}

3、at()函數(shù)訪問

at()函數(shù)像素訪問

//方式3:at()函數(shù)操作(逐像素訪問)
void At()
{//彩色圖for (int i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++)				//逐像素{src.at<Vec3b>(i, j)[0] = 255 - (int)src.at<Vec3b>(i, j)[0];		//逐通道src.at<Vec3b>(i, j)[1] = 255 - (int)src.at<Vec3b>(i, j)[1];		//逐通道src.at<Vec3b>(i, j)[2] = 255 - (int)src.at<Vec3b>(i, j)[2];		//逐通道}}//灰度圖for (int i = 0; i < src_gray.rows; i++){for (int j = 0; j < src_gray.cols; j++){src_gray.at<uchar>(i, j) = 255 - (int)src_gray.at<uchar>(i, j);}}
}

總代碼

//圖像像素的三種訪問方式(指針、迭代器、at()函數(shù))
//指針:逐通道訪問		迭代器:逐像素訪問		at()函數(shù):逐通道訪問
#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;Mat src, src_gray;//圖像初始化
void Image_Init()
{src = imread("Resource/test.jpg");					//讀取if (src.empty()){printf("could not load the picture...");}cvtColor(src, src_gray, COLOR_RGB2GRAY);
}//方式1:指針操作(逐通道訪問)
void Handle_Ptr()
{uchar* p;//彩圖for (int i = 0; i < src.rows; i++){p = src.ptr<uchar>(i);				//指向每一行首地址for (int j = 0; j < src.cols * src.channels(); j++){p[j] = 255 - p[j];					//反差處理(逐通道)}}//灰度圖for (int i = 0; i < src_gray.rows; i++){p = src_gray.ptr<uchar>(i);				//指向每一行首地址for (int j = 0; j < src_gray.cols; j++){p[j] = 255 - p[j];							//反差處理(逐通道)}}
}//方式2:迭代器操作(逐像素訪問)
void Iterator()
{//彩色圖//獲取迭代器Mat_<Vec3b>::iterator it1 = src.begin<Vec3b>();			//初始位置的迭代器Mat_<Vec3b>::iterator itend1 = src.end<Vec3b>();		//終止位置的迭代器//彩色圖逐像素操作for ( ; it1 != itend1; it1++)			//逐像素{(*it1)[0] = 255 - (*it1)[0];			//逐通道(*it1)[1] = 255 - (*it1)[1];			//逐通道(*it1)[2] = 255 - (*it1)[2];			//逐通道}//灰度圖//獲取迭代器Mat_<uchar>::iterator it2 = src_gray.begin<uchar>();			//初始位置的迭代器Mat_<uchar>::iterator itend2 = src_gray.end<uchar>();		//終止位置的迭代器//灰度圖逐像素操作for (; it2 != itend2; it2++){(*it2) = 255 - (*it2);}
}//方式3:at()函數(shù)操作(逐像素訪問)
void At()
{//彩色圖for (int i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++)				//逐像素{src.at<Vec3b>(i, j)[0] = 255 - (int)src.at<Vec3b>(i, j)[0];		//逐通道src.at<Vec3b>(i, j)[1] = 255 - (int)src.at<Vec3b>(i, j)[1];		//逐通道src.at<Vec3b>(i, j)[2] = 255 - (int)src.at<Vec3b>(i, j)[2];		//逐通道}}//灰度圖for (int i = 0; i < src_gray.rows; i++){for (int j = 0; j < src_gray.cols; j++){src_gray.at<uchar>(i, j) = 255 - (int)src_gray.at<uchar>(i, j);}}
}//顯示圖像
void Image_Show()
{imshow("彩圖", src);imshow("灰度圖", src_gray);
}int main()
{Image_Init();					//圖像初始化//Handle_Ptr();					//1、指針操作//Iterator();					//2、迭代器操作At();							//3、at()函數(shù)操作Image_Show();					//顯示圖像waitKey(0);return 0;
}

效果

?

參考資料

https://blog.csdn.net/zhu_hongji/article/details/81333200

總結(jié)

以上是生活随笔為你收集整理的OpenCV(总结篇)图像逐像素访问(三种操作:指针、迭代器、at()函数)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。