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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

OpenCV掩码、blending、改变对比度和亮度、随机发生器和绘图

發布時間:2025/3/15 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV掩码、blending、改变对比度和亮度、随机发生器和绘图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

掩碼

一般來說是對某個像素鄰域內的幾個像素進行相應的操作實現對圖像的濾波等操作。

0-10
-15-1
0-10

例如上面的這個掩碼核,使用它來對整副圖像進行操作。具體代碼如下:

const uchar* pre;const uchar* courrent;const uchar* next;for(int i = 1;i < height-1;i++){pre = src.ptr<uchar>(i-1);courrent = src.ptr<uchar>(i);next = src.ptr<uchar>(i+1);for(int j = 1;j < width-1;j++){ dst.at<uchar>(i,j) = saturate_cast<uchar>(5*courrent[j]-courrent[j-1]-courrent[j+1]-pre[j]-next[j]);}}

同樣OpenCV給們提供了相應的api使用,不用自己去一點點敲

Mat kernel = (Mat_<char>(3,3) << 0,-1,0,-1,5,-1,0,-1,0);filter2D(src,api_dst,src.depth(),kernel);

效果是一樣的。

Blending

兩幅圖像進行疊加:
g(i,j) = a*f1(i,j) + (1-a)f2(i,j) + b
分為兩種情況:

  • 兩幅圖像大小不同,首先對一個圖像進行resize,化為兩個大小一樣,然后在相疊加。
  • 兩幅圖像大小不同,將小的圖像直接疊加在大圖的某一區域。

第一種情況:
兩個大小不一樣

resize(icon,icon,Size(map.cols,map.rows));const Vec3b* map_ptr;const Vec3b* icon_ptr;Vec3b* result_ptr; for(int i = 0;i < map.rows-1;i++){ map_ptr = map.ptr<Vec3b>(i);icon_ptr = icon.ptr<Vec3b>(i);result_ptr = result.ptr<Vec3b>(i);for(int j = 0;j < map.cols-1;j++){result_ptr[j][0] = saturate_cast<uchar>(map_ptr[j][0]*0.3+icon_ptr[j][0]*0.7);result_ptr[j][1] = saturate_cast<uchar>(map_ptr[j][1]*0.3+icon_ptr[j][1]*0.7);result_ptr[j][2] = saturate_cast<uchar>(map_ptr[j][2]*0.3+icon_ptr[j][2]*0.7);}}

同樣的OpenCV提供了相應的API:

resize(icon,icon,Size(map.cols,map.rows)); addWeighted(map,0.3,icon,0.7,0,result);

第二種情況相對來說實現其來相對來所比較復雜,所以專門寫一個函數來進行操作:

Mat Add(const Mat src1,float bate,const Mat src2,float alpha,int x,int y,int width,int height) {Mat result;src1.copyTo(result);const Vec3b* ptr1;const Vec3b* ptr2;Vec3b* result_ptr;for(int i = 0;i< height-1;i++){ptr1 = src1.ptr<Vec3b>(i+y);ptr2 = src2.ptr<Vec3b>(i);result_ptr = result.ptr<Vec3b>(i+y);for(int j = 0;j < width-1;j++){result_ptr[j+x][0] = saturate_cast<uchar>(ptr1[j+x][0]*bate + ptr2[j][0]*alpha);result_ptr[j+x][1] = saturate_cast<uchar>(ptr1[j+x][1]*bate + ptr2[j][1]*alpha);result_ptr[j+x][2] = saturate_cast<uchar>(ptr1[j+x][2]*bate + ptr2[j][2]*alpha);}}return result; }

同樣的,也有相應的API:

Mat imageROI;imageROI = map(Rect(20,20,icon.cols,icon.rows));addWeighted(icon,0.5,imageROI,0.5,0,imageROI);imshow("result1",map);

改變對比度和亮度

g(i,j) = a* f(i,j) + b
a值用來改變圖像的對比度,b值用來改變圖像的亮度。
同樣的,自定義一個函數來進行對比度和亮度的改變。

Mat Change(const Mat src,float bate,float alpha) {Mat result = Mat::zeros(src.size(),src.type());const Vec3b* ptr;Vec3b* res_ptr;for(int row = 0;row < src.rows - 1;row++){ptr = src.ptr<Vec3b>(row);res_ptr = result.ptr<Vec3b>(row);for(int col = 0;col < src.cols - 1;col++){res_ptr[col][0] = saturate_cast<uchar>(ptr[col][0] * bate + alpha);res_ptr[col][1] = saturate_cast<uchar>(ptr[col][1] * bate + alpha);res_ptr[col][2] = saturate_cast<uchar>(ptr[col][2] * bate + alpha);}}return result; }

同樣的,也有相應的API供我們使用:

map.convertTo(map,-1,1.0,100);imshow("map2",map);

隨機發生器和繪圖

隨機發生器:

RNG rng(0xffffffff);定義隨機發生器的對象,并用0xffffffff來進行初始化。 int x = rng.uniform(start,end);

繪制直線:

line(image,開始點,結束點,Scalar(0,0,0),線寬,類型=8連續);

繪制矩形:

rectangle(image,左上頂點,右下頂點,Scalar(0,0,0),線寬=-1填充,類型=8連續);

有代碼如下:

RNG rng(0xffffffff);Mat image = Mat::zeros(500,500,CV_8UC3);imshow("image",image);Scalar color ;Point start_p,end_p;for(int i = 0;i < 100;i++){color = Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));start_p.x = rng.uniform(0,500);start_p.y = rng.uniform(0,500);end_p.x = rng.uniform(0,500);end_p.y = rng.uniform(0,500);rectangle(image,start_p,end_p,color,-1,8);}imshow("image",image);

總結

以上是生活随笔為你收集整理的OpenCV掩码、blending、改变对比度和亮度、随机发生器和绘图的全部內容,希望文章能夠幫你解決所遇到的問題。

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