濾波是影象處理中的乙個基本操作。濾波去除影象中的雜訊,提取感興趣的特徵,允許影象重取樣。
影象中的頻率和空域:空間域指用影象的灰度值來描述衣服影象,而頻域指用影象灰度值的變化來描述一幅影象。
低通濾波器和高通濾波器的概念是在頻率中產生的。低通濾波器指去除影象中的高頻成分,而高通濾波器指去除影象中的低頻成分。
blur(image,result,size(5,5));//模板大小 5*5
namedwindow("均值濾波");
imshow("均值濾波",result);
gaussianblur(image,result,size(7,7),1.5); 是sigma係數
namedwindow("高斯濾波");
imshow("高斯濾波",result);低通濾波器的效果是對影象進行模糊和平滑,減弱了物體邊緣可見的快速變化。它是一種線性濾波器,原理是與核進行卷積運算,此時的核是內定的。如果你需要自定義核,我們就可以使用filter2d指定 mask模板。
medianblur(image,result,5);// 5 是ksize
namedwindow("中值濾波");
imshow("中值濾波",result);
y方向可以這麼記:
下減上。 在模板中的第三行減去第一行,就是求導了。
x方向同理。右減左。
sobel(inputarray src, outputarray dst, int ddepth,int dx, int dy, int
ksize=3,doublescale=1, double delta=0,int bordertype=border_default );
ddepth為影象型別,(dx,dy) = (1,0)為x方向導數,(dx,dy) = (0,1)為y方向導數。 scale和delta的作用是在對影象儲存前可以對影象進行縮放操作。
即為dst = dst*scale+delta;
示例**如下:
namedwindow("sobel濾波");
imshow("sobel濾波",sobel_x);
mat matlaplacian;
//laplacian(image,matlaplacian,cv_16s,3);或者直接cv_16s型別,這樣不需要進行轉變,但是此時計算的值會失去精度
matlaplacian = abs(matlaplacian);//二階導數肯定含有負數
matlaplacian.convertto(matlaplacian,cv_8u);
namedwindow("拉普拉斯");
imshow("拉普拉斯",matlaplacian);
sobel運算元和拉普拉斯變換可以進行邊緣檢測,但是這樣的二值邊緣影象有兩個缺點:第一,檢測到的邊緣過粗,這意味著難以實現物體的精確定位。第二,難以找到這樣的閾值,即能夠檢測到所有重要的邊緣,同時不至於包含過多次要的邊緣。
高斯濾波器的大小:第一步所用的平滑濾波器將會直接影響 canny 演算法的結果。opencv中沒有這個引數的設定,matlab中有。
threshold(image,bw,100,255,thresh_binary);//進行二值化
vector
> contours;
//可以進一步處理 移除過小或過大的輪廓
int cmin = 100;
int cmax = 1000;
vector
>::const_iterator itc = contours.begin();
while (itc!=contours.end())
else itc++;
}mat conresult(image.size(),cv_8u,scalar(255));
drawcontours(conresult,contours,-1,scalar(0),2);
namedwindow("輪廓");
imshow("輪廓",conresult);
//原始hough變換
}namedwindow("基本hough");
imshow("基本hough",image);
houghlines的計算效率比較低o(n*n*m),耗時較長,而且沒有檢測出直線的端點。概論霍夫直線檢測houghlinesp是乙個改進,不僅執行效率較高,而且能檢測到直線的兩個端點。
houghlinesp不是系統的進行掃瞄影象,而是隨機挑選畫素點,一旦累加器中某一項達到給定的最小值,那麼掃瞄沿著對應畫素並移除所有經過的畫素點。得到的是一條線段。會將一條直線(表示為x0,y0,x1,y1)放入vector中。
houghlinesp(result,lineshoughp,1,3.1415926/180,50,50,10);//最小投票為50(直線上的點不少於50),線條不短於50,間隙不小於10
for (size_t i =0;i0],i[1]),point(i[2],i[3]),scalar(255),3,cv_aa);
}namedwindow("概念hough");
imshow("概念hough",image);其實hough變換理論可以檢測任何可以使用引數表示的圖形,比如常用的還有hough圓檢測,類似。
vector
circles;
houghcircles(result,circles,cv_hough_gradient,
2,//累加器的解析度
50,//兩個圓之間的最小距離
200,//canny高閾值
100,//最小投票數
);
houghcircles整合了canny檢測和hough變換。 基本opencv2處理方法(二)
使用filter2d進行鄰域計算 void shape2d const mat image,mat result main函式呼叫 result.row 0 setto scalar 0 可以將result矩陣的第0行所有畫素全部設定為0。算術操作 opencv過載了很多操作符 你可以直接對它們進行...
opencv(2) 處理畫素值
opencv中使用mat資料型別表示影象,這是類似int float等傳統型別的一種opencv中定義的資料型別。opencv常見的資料型別 point 代表二維點,用於影象座標點。如point 20,80 scalar 表示4元素標量,常用於rgb顏色值,一般第四個引數用不到。畫素是由顏色空間或通...
struts2學習筆記 三 處理使用者輸入資訊
1.struts2處理使用者輸入資訊 1.1.領域物件 還記得之前在loginaction類中有如下的屬性嗎?private user user 在這裡暫時還沒有用到。後面會有所講解 現在可以說一下了,其實user和其他的基本型別是一樣的,只不過我們將其與前面的封裝屬性值分離開來了,當前這種稱為領域...