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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

OpenCV 像素的读取与操作

發布時間:2023/12/2 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV 像素的读取与操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

像素讀取和操作

1. 利用cv::Matat函數,直接訪問具體地址

void get_setImagePixel(char *imagePath, int x, int y){// Mat image = imread(imagePath , 0);Mat image = imread(imagePath, 1);//得寬高int w = image.cols;int h = image.rows;int channels = image.channels();if (x < w && y < h){//灰度圖,像素為單通道if (channels == 1){int pixel = image.at<uchar>(x, y);cout << "灰度圖像,處的灰度值為" << pixel << endl;}else{//通過實驗,彩色圖像的默認存儲是bgr, 且存儲的格式如下//讀取int b = image.at<Vec3b>(x, y)[0]; // b = image.at<uchar>(x,y*3);cout << b << endl;int g = image.at<Vec3b>(x, y)[1]; //g = image.at<uchar>(x, y * 3 + 1);cout << g << endl;int r = image.at<Vec3b>(x, y)[2]; //r = image.at<uchar>(x, y * 3 + 1);cout << r << endl;//設置像素值image.at<Vec3b>(x, y)[0] = 255;image.at<Vec3b>(x, y)[1] = 255;image.at<Vec3b>(x, y)[2] = 255;}}imshow("cc", image);}

?

2. 利用Mat prt 函數:行首地址訪問

void get_setImagePixel2(char *imagePath, int x, int y){Mat image = imread(imagePath, 1);//得寬高int w = image.cols;int h = image.rows;int channels = image.channels();//如果圖像連續 ,可以將數據轉化為1維數組,提高訪問效率,但對少量像素訪問就沒必要//if (image.isContinuous())//{// //reshape函數用于改變矩陣維度 // //圖像行數為1,列數為原先的行數乘上列數 // image.reshape(1, image.cols*image.rows);//}//獲得第y行的首地址uchar *data = image.ptr<uchar>(y);int position = x*channels;if (channels == 1){int pixel = data[position];cout << "灰度圖像,處的灰度值為" << pixel << endl;}else{//通過實驗,彩色圖像的默認存儲是bgr, 且存儲的格式如下//讀取int b = data[position];cout << b << endl;int g = data[position+1];cout << g << endl;int r = data[position+2];cout << r << endl;//設置像素值data[position] = 255;data[position+1] = 255;data[position+2] = 255;}imshow("cc", image);}

3. 利用迭代器遍歷圖像
?

void get_setImagePixel3(char *imagePath, int x, int y){Mat image = imread(imagePath, 1);//得寬高int w = image.cols;int h = image.rows;int channels = image.channels();if (channels == 1){//得到初始位置的迭代器 Mat_<uchar>::iterator it = image.begin<uchar>();//得到終止位置的迭代器 Mat_<uchar>::iterator itend = image.end<uchar>();int pixel = *(it + y * w + x);cout << "灰度圖像,處的灰度值為" << pixel << endl;}else{//得到初始位置的迭代器 Mat_<Vec3b>::iterator it = image.begin<Vec3b>();//得到終止位置的迭代器 Mat_<Vec3b>::iterator itend = image.end<Vec3b>();//讀取it = it + y * w + x;int b = (*it)[0];cout << b << endl;int g = (*it)[1];cout << g << endl;int r = (*it)[2];cout << r << endl;//設置像素值(*it)[0] = 255;(*it)[1] = 255;(*it)[2] = 255;}imshow("cc", image);}

若是大量訪問數據和更改數據時用第二種方式效率高。

Node:?在修改像素時候,最好先用變量存儲,設定好了再賦值給Mat成員對象,如data,因為如果直接進行操作時,當一個分量值大于255時,向前進1的原則,則會修改前面像素的值,如下:

id colorReduce(cv::Mat&image, int div){int nl = image.rows; //圖像的行數 //圖像每行的像素數 int nc = image.cols * image.channels();for (int j = 0; j<nl; j++){//得到第j行的首地址 uchar* data = image.ptr<uchar>(j);//遍歷每行的像素 for (int i = 0; i<nc; i++){//printf("%d ", data[i]);//data[i] = data[i] / div*div + 6;// 這里需要用c來存儲,因為如果大于255時會向前進1,則影響前面的像素,data[i] 會自己變得小255int c = data[i] / div*div + 100; data[i] = c > 255 ? 255 : c; //將每個像素值都變為div的倍數,即將顏色數縮減了div倍 }}

?

總結

以上是生活随笔為你收集整理的OpenCV 像素的读取与操作的全部內容,希望文章能夠幫你解決所遇到的問題。

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