卷積邊緣問題
l影象卷積的時候邊界畫素,不能被卷積操作,原因在於邊界畫素沒有完全跟
kernel
重疊,所以當
3x3濾波時候有
1個畫素的邊緣沒有被處理,
5x5濾波的時候有
2個畫素的邊緣沒有被處理。
處理邊緣
在卷積開始之前增加邊緣畫素,填充的畫素值為0或者
rgb黑色,比如
3x3在
四周各填充
1個畫素的邊緣,這樣就確保影象的邊緣被處理,在卷積處理之
後再去掉這些邊緣。
opencv
中預設的處理方法是:
border_default
,此外
常用的還有如下幾種: -
border_constant–
填充邊緣用指定畫素值 -
border_replicate–填充邊緣畫素用已知的邊緣畫素值
。
- border_wrap–
用另外一邊的畫素來補償填充
border_replicate–通過插值計算
border_wrap– 另外一邊補償
api說明–給影象新增邊緣api
lcopymakeborder(
- mat
src, //
輸入影象
- mat
dst, //
新增邊緣影象 -
inttop, //
邊緣長度,一般上下左右都取相同值, -
intbottom, -
intleft, -
intright, -
intbordertype
// 邊緣型別
- scalar value )
#include #include using namespace std;
using namespace cv;
mat src, dst, gray_src;
int main(int agrc, char** agrv)
const char* input_win = "input";
const char * out_put = "rober x";
namedwindow(input_win, cv_window_autosize);
namedwindow(out_put, cv_window_autosize);
imshow(input_win, src);
int top = (int)(0.05*src.rows);
int bottom = (int)(0.05*src.rows);
int left = (int)(0.05*src.cols);
int right = (int)(0.05*src.cols);
rng rng(12345);
int bordertype = border_default;
int c = 0;
while (true)
if ((char)c == 'r')
else if ((char)c == 'w')
else if ((char)c == 'c')
scalar color = scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
copymakeborder(src, dst, top, bottom, left, right, bordertype, color);
imshow(out_put, dst);
} /*gaussianblur(src, dst, size(5, 5), 0, 0, border_default);//最後一項為邊緣處理方式
imshow(out_put, dst);*/
waitkey(0);
return 0;
}
opencvC 學習16處理邊緣
影象卷積的時候邊界畫素,不能被卷積操作,原因在於邊界畫素沒有完全跟kernel重疊,所以當3x3濾波時候有1個畫素的邊緣沒有被處理,5x5濾波的時候有2個畫素的邊緣沒有被處理。在卷積開始之前增加邊緣畫素,填充的畫素值為0或者rgb黑色,比如3x3在 四周各填充1個畫素的邊緣,這樣就確保影象的邊緣被處...
opencv(2) 處理畫素值
opencv中使用mat資料型別表示影象,這是類似int float等傳統型別的一種opencv中定義的資料型別。opencv常見的資料型別 point 代表二維點,用於影象座標點。如point 20,80 scalar 表示4元素標量,常用於rgb顏色值,一般第四個引數用不到。畫素是由顏色空間或通...
opencv邊緣處理
影象卷積的時候邊界畫素,不能被卷積操作,原因在於邊界畫素沒有完全跟 kernel 重疊,所以當 3x3濾波時候有 1個畫素的邊緣沒有被處理,5x5濾波的時候有 2個畫素的邊緣沒有被處理。在卷積開始之前增加邊緣畫素,填充的畫素值為0或者 rgb黑色,比如 3x3在四周各填充1 個畫素的邊緣,這樣就確保...