經常會需要用到濾波器(卷積處理)
但在邊界
中心沒有足夠像素做運算
也就是說濾波器在圖像邊界上時
需要的像素大於原始圖像的邊界
拓展邊界
是其中一種解決的方式
大概可分為4種類型
1.重複邊界
2.反射
3.反射101
4.加上常量
1.BORDER_REPLICATE
重複邊界直接以圖像最外圍做重複值的拓展
也是OpenCV中medianBlur的默認值
2.BORDER_REFLECT
以邊界作為鏡子鏡像拓展
假設
abcdefg為一張圖像
那麼往右拓展就會變成
abcdefg | gfedcba
3.BORDER_REFLECT_101
跟2.的方法很像
abcdefg | fedcba
4.BORDER_CONSTANT
以常數往外推
以下為Lena.jpg往外擴展5像素的範例
會使用到copyMakeBorder這個函式
copyMakeBorder(src, dst, top, bottom, left, right, Border, Constant);
src: 來源影像
dst: 目的影像
top, bottom, left, right : 往上,下,左,右拓展多少像素
Border: Border類型
Constant: 如用常數時,這裡可設定值
#include <iostream>
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat src;
Mat replace;
Mat reflect;
Mat reflect_101;
Mat constant;
src = imread("Lena.jpg");
if (src.empty())
{
return -1;
}
imshow("src", src);
int top = 10;
int bottom = 10;
int left = 10;
int right = 10;
copyMakeBorder(src, replace, top, bottom, left, right, BORDER_REPLICATE);
copyMakeBorder(src, reflect, top, bottom, left, right, BORDER_REFLECT);
copyMakeBorder(src, reflect_101, top, bottom, left, right, BORDER_REFLECT_101);
copyMakeBorder(src, constant, top, bottom, left, right, BORDER_CONSTANT, 0);
imshow("Replaicate", replace);
imshow("Reflect", reflect);
imshow("Reflect_101", reflect_101);
imshow("Constant", constant);
waitKey(0);
return 0;
}
沒有留言:
張貼留言