opencv 圖形處理

擴充邊緣

函數:copyMakeBorder

函數原型:

void copyMakeBorder( const Mat& src, Mat& dst,int top, int bottom, int left, int right,int borderType, const Scalar& value=Scalar() );

功能

擴充src邊緣,將圖像變大,便於處理邊界,該函數調用了cv::borderInterpolate,

參數:

src,dst:原圖與目標圖像。
top,bottom,left,right 分別表示在原圖四周擴充邊緣的大小。
borderType: 擴充邊緣的類型,OpenCV中給出以下幾種方式。
value :當borderType爲BORDER_CONSTANT時,需要填充的常量像素值。

borderType的宏定義說明

/*
 Various border types, image boundaries are denoted with '|'
 * BORDER_REPLICATE:     aaaaaa|abcdefgh|hhhhhhh
 * BORDER_REFLECT:       fedcba|abcdefgh|hgfedcb
 * BORDER_REFLECT_101:   gfedcb|abcdefgh|gfedcba
 * BORDER_WRAP:          cdefgh|abcdefgh|abcdefg
 * BORDER_CONSTANT:      iiiiii|abcdefgh|iiiiiii  with some specified 'i'
 */

BORDER_REPLICATE:複製法,也就是複製最邊緣像素。
BORDER_REFLECT_101:對稱法,也就是以最邊緣像素爲軸,對稱。
BORDER_CONSTANT:常量法。

Demo

copyMakeBorder(src, src, 2, 2, 2, 2,BORDER_CONSTANT,Scalar(0,0,255));
copyMakeBorder(src, dst, 8, 8, 8, 8,BORDER_REPLICATE);

旋轉

函數

getRotationMatrix2D函數 求得旋轉矩陣
warpAffine函數 實現仿射變換

函數原型

Mat getRotationMatrix2D(Point2f center,double angle,double scale)
void warpAffine (InputArray src,
        OutputArray     dst,
        InputArray      M,
        Size            dsize,
        int             flags = INTER_LINEAR,
        int             borderMode = BORDER_CONSTANT,
        const Scalar &  borderValue = Scalar() )

參數:

getRotationMatrix2D 參數:

Point2f center:表示旋轉的中心點
double angle:表示旋轉的角度 負數表示逆時針旋轉
double scale:圖像縮放因子

warpAffine 參數

src: 輸入圖像
dst: 輸出圖像,尺寸由dsize指定,圖像類型與原圖像一致
M: 2X3的變換矩陣
dsize: 指定圖像輸出尺寸
flags: 插值算法標識符,有默認值INTER_LINEAR,如果插值算法爲WARP_INVERSE_MAP, warpAffine函數使用如下矩陣進行圖像轉換
borderMode: 邊界像素模式(和擴展邊緣一致),有默認值BORDER_CONSTANT
borderValue: 邊界取值,有默認值Scalar()即0

dst(x,y) = src(M11x + M12y + M13,M21x + M22y +M23)

flags 插值算法標誌符
標誌符 含義
INTER_NEAREST 最臨近插值算法
INTER_LINEAR 線性插值算法
INTER_AREA 區域插值
INTER_CUBIC 三次樣條插值
INTER_LANCZOS4 Lanczos插值

Demo

float radian = (float)(45 / 180.0 * CV_PI);
float result = 1.00 / cos(radian);
//填充圖像
int maxBorder = (int)(max(src.cols, src.rows)* result); //即爲sqrt(2)*max
int dx = (maxBorder - src.cols) / 2;
int dy = (maxBorder - src.rows) / 2;
//dy, dy, dx, dx : 上下左右添加像素個數
copyMakeBorder(src, dst, dy, dy, dx, dx, IPL_BORDER_REPLICATE);

//旋轉
Point2f center((float)(dst.cols / 2), (float)(dst.rows / 2));
Mat affine_matrix = getRotationMatrix2D(center, 45, 1.0);//求得旋轉矩陣
warpAffine(dst, dst, affine_matrix, dst.size(),INTER_LINEAR,BORDER_REPLICATE);

//計算圖像旋轉之後包含圖像的最大的矩形
float sinVal = abs(sin(radian));
float cosVal = abs(cos(radian));
Size targetSize((int)(src.cols * cosVal + src.rows * sinVal),(int)(src.cols * sinVal + src.rows * cosVal));

//剪掉多餘邊框
int x = (dst.cols - targetSize.width) / 2;
int y = (dst.rows - targetSize.height) / 2;
Rect rect(x, y, targetSize.width, targetSize.height);
dst = Mat(dst, rect);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章