學(xué)習(xí)計(jì)算機(jī)視覺(jué)最重要的能力應(yīng)該就是編程了。
圖像初始化操作
#include#include usingnamespacestd; usingnamespacecv; intmain(intargc,char** argv) { //這些方式都是自己擁有獨(dú)立的內(nèi)存空間 Matimg1(2,2, CV_8UC3, Scalar(0,0,255)); cout<< img1 < 圖像二值化操作
兩種方法,全局固定閾值二值化和局部自適應(yīng)閾值二值化全局固定閾值很容易理解,就是對(duì)整幅圖像都是用一個(gè)統(tǒng)一的閾值來(lái)進(jìn)行二值化;局部自適應(yīng)閾值則是根據(jù)像素的鄰域塊的像素值分布來(lái)確定該像素位置上的二值化閾值。
#include#include usingnamespacestd; usingnamespacecv; intmain(intargc,char** argv) { Mat image = imread("lol1.jpg", CV_LOAD_IMAGE_GRAYSCALE);//注意了,必須是載入灰度圖 if(image.empty()) { cout<"read image failure"?< 腐蝕操作
#include#include usingnamespacecv; usingnamespacestd; intmain() { Mat SrcPic = imread("lena.jpg"); imshow("Src Pic", SrcPic); Mat element = getStructuringElement(MORPH_RECT, Size(15,15));//getStructuringElement函數(shù)返回的是指定形狀和尺寸的結(jié)構(gòu)元素 Mat DstPic; erode(SrcPic, DstPic, element);//腐蝕操作 imshow("腐蝕效果圖", DstPic); waitKey(); return0; }
均值濾波實(shí)現(xiàn)圖像模糊
#include#include usingnamespacecv; usingnamespacestd; intmain() { Mat SrcPic = imread("lena.jpg"); imshow("Src Pic", SrcPic); Mat DstPic; blur(SrcPic, DstPic, Size(7,7)); imshow("均值模糊效果圖", DstPic); waitKey(); return0; } 思路:將原始圖像轉(zhuǎn)化為灰度圖,用blur函數(shù)進(jìn)行圖像模糊以降噪,然后用canny函數(shù)進(jìn)行邊緣檢測(cè)。
#include#include usingnamespacecv; usingnamespacestd; intmain() { Mat SrcPic = imread("lena.jpg"); imshow("Src Pic", SrcPic); Mat DstPic, edge, grayImage; //創(chuàng)建與src同類(lèi)型和同大小的矩陣 DstPic.create(SrcPic.size(), SrcPic.type()); //將原始圖轉(zhuǎn)化為灰度圖 cvtColor(SrcPic, grayImage, COLOR_BGR2GRAY); //先使用3*3內(nèi)核來(lái)降噪 blur(grayImage, edge, Size(3,3)); //運(yùn)行canny算子 Canny(edge, edge,3,9,3); imshow("邊緣提取效果", edge); waitKey(); return0; }
轉(zhuǎn)為灰度圖
#include#include usingnamespacestd; usingnamespacecv; intmain() { Mat img = imread("lol1.jpg"); Mat dstImg; cvtColor(img, dstImg,COLOR_BGR2GRAY);//從宏名字就可以知道,是彩色圖轉(zhuǎn)換到灰度圖 imshow("灰度圖", dstImg); waitKey(0); } 訪(fǎng)問(wèn)圖片中像素
#include#include usingnamespacestd; usingnamespacecv; //訪(fǎng)問(wèn)每個(gè)像素,我喜歡使用指針的方式 intmain() { Mat img = imread("lol1.jpg"); for(inti =0; i < img.rows; i++) ? ?{ ? ? ? ?uchar* data = img.ptr (i); //獲取第i行地址 for(intj =0; j < img.cols; j++) ? ? ? ?{ ? ? ? ? ? ??printf("%d ",data[j]); ? ? ? ?} ? ?} ? ?waitKey(0); } 直方圖均衡化
#include#include usingnamespacestd; usingnamespacecv; //直方圖均衡化 intmain() { Mat img = imread("lol3.jpg"); imshow("原始圖", img); Mat dst; cvtColor(img, img, CV_RGB2GRAY); imshow("灰度圖", img); equalizeHist(img, dst); imshow("直方圖均衡化", dst); waitKey(0); } 顯然均衡化后的圖片對(duì)比度變高了,變得更加明亮!
常用的數(shù)據(jù)結(jié)構(gòu)
#include#include usingnamespacestd; usingnamespacecv; //常見(jiàn)數(shù)據(jù)結(jié)構(gòu)使用方法總結(jié) intmain() { //Mat的用法 Matm1(2,2, CV_8UC3, Scalar(0,0,255));//其中的宏的解釋?zhuān)篊V_[位數(shù)][帶符號(hào)與否][類(lèi)型前綴]C[通道數(shù)] cout << m1 << endl; ? ?//或者,利用IplImage指針來(lái)初始化,將IplImage*轉(zhuǎn)化為Mat ? ?IplImage* image = cvLoadImage("lena.jpg"); ? ?Mat mat = cvarrToMat(image); ? ?//Mat轉(zhuǎn)IplImage: ? ?IplImage img = IplImage(mat); ? ?//或者 ? ?Mat m2; ? ?m2.create(4,?5, CV_8UC(2)); ? ?//點(diǎn)的表示:Point ? ?Point p; ? ?p.x =?1;?//x坐標(biāo) ? ?p.y =?1;?//y坐標(biāo) ? ?//或者 ? ?Point?p2(1,?1); ? ?//顏色的表示:Scalar(b,g,r);注意不是rgb,注意對(duì)應(yīng)關(guān)系 ? ?Scalar(1,?1,?1); ? ?//尺寸的表示:Size ? ?Size(5,?5);// 寬度和高度都是5 ? ?//矩形的表示:Rect,成員變量有x,y,width,height ? ?Rect?r1(0,?0,?100,?60); ? ?Rect?r2(10,?10,?100,?60); ? ?Rect r3 = r1 | r2;?//兩個(gè)矩形求交集 ? ?Rect r4 = r1 & r2;?//兩個(gè)矩形求并集 ? ?waitKey(0); } 結(jié)束語(yǔ)
審核編輯:黃飛
-
邊緣檢測(cè)
+關(guān)注
關(guān)注
0文章
92瀏覽量
18204 -
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
573瀏覽量
40123 -
OpenCV
+關(guān)注
關(guān)注
31文章
634瀏覽量
41338
原文標(biāo)題:學(xué)習(xí)Opencv不得不掌握的操作
文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺(jué)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論