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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章