第九天:图像几何变换

来源:互联网 发布:云计算技术与应用专科 编辑:程序博客网 时间:2024/05/16 19:29

图像几何变换

1、图像缩放-resize()
Mat dstImg;resize(srcImg, dstImg, Size(1200, 800));
src: 输入图像,Mat类型即可
dst: 输出图像,当其非0时,由dsize确定尺寸
dsize: Size类型,指定输出图像大小,如果它等于0,由下式计算:
dsize = Size(round(fx*src.cols), round(fy*src.rows))
fx: 沿水平方向的缩放系数,默认值0,等于0时,由下式计算:
(double)dsize.width/src.cols
fy: 沿垂直方向的缩放系数,默认值0,等于0时,由下式计算:
(double)dsize.height/src.rows
interpolation: 用于指定插值方式,默认为INTER_LINEAR(线性插值)

2、图像平移
(1)、平移后图像大小不变,信息丢失
Mat imgTranslate(Mat &srcImg, int xOffset, int yOffset){int rows = srcImg.rows;int cols = srcImg.cols;Mat dstImg = Mat::zeros(srcImg.size(), srcImg.type());  //创建全黑图像for(int i=0; i<rows; i++){for(int j = 0; j<cols; j++){int x = j + xOffset;int y = i + yOffset;if(x >=0 && y>=0 && x<cols && y<rows){dstImg.at<Vec3b>(y, x) = srcImg.at<Vec3b>(i, j);}}}return dstImg;}
调用:
Mat dstImg = imgTranslate2(srcImg, -20, -30);
(2)、平移后图像大小改变,信息完整
Mat imgTranslate2(Mat &srcImg, int xOffset, int yOffset){int rows = srcImg.rows + yOffset;int cols = srcImg.cols + xOffset;Mat dstImg = Mat::zeros(rows, cols, srcImg.type());  //创建全黑图像for(int i=0; i<rows; i++){for(int j = 0; j<cols; j++){int x = j + xOffset;int y = i + yOffset;if(x >=0 && y>=0 && x<cols && y<rows){dstImg.at<Vec3b>(y, x) = srcImg.at<Vec3b>(i, j);}}}return dstImg;}
调用:
Mat dstImg = imgTranslate2(srcImg, -20, -30);

3、图像旋转
OpenCV没有提供直接旋转图像的函数
图像旋转可能会造成图像信息丢失
图像旋转可以用仿射变换来实现
主要用到函数:
getRotationMatrix2D()warpAffine()
实例:
Mat srcImg = imread("1.jpg");Point2f center = Point2f(srcImg.cols/2, srcImg.rows/2);  //定义旋转中心坐标double angle = 30;double scale = 0.5;Mat roateM;roateM = getRotationMatrix2D(center, angle, scale);  //获得旋转矩阵Mat dstImg;warpAffine(srcImg, dstImg, roateM, Size(1000, 800));imshow("src", srcImg);imshow("dst", dstImg);
总上旋转图像一般分为两步,定义旋转中心,或得图像的旋转矩阵

4、转置和镜像
用到的函数 transpose()、flip()
可以实现转置和镜像变换,以及90°,180°旋转
例:
Mat srcImg = imread("1.jpg");Mat dstImg;transpose(srcImg, dstImg);flip(dstImg, dstImg, 0);
flipCode = 0, 垂直翻转(沿X轴翻转);
flipCode > 0, 水平翻转(沿Y轴翻转);
flipCode < 0, 水平垂直翻转(180°中心对称)

5、重映射
重映射是指把一个图像中的一个位置的像素通过映射关系转换到另一图像的指定
位置。对于输入原图像f(x, y), 目标图像g(x, y), 映射关系为T, 则满足下式:
g(x, y) = T(f(x, y))

相关函数:
remap(srcImg, dstImg, xMapImg, yMapImg, CV_INTER_LINEAR);
map1: 表示(x, y)点的坐标或x坐标,CV_16SC2, CV_32FC1,CV_32FC2类型
map2: 表示(x, y)点y坐标,如果map1为(x, y),map2可以选择不用,可以是CV_16UC1, CV_32FC1
interpolation: 表示插值方法
borderMode: 表示边界插值类型
borderValue: 表示插值数值

例子:
Mat srcImg = imread("1.jpg");Mat dstImg;int rows = srcImg.rows;int cols = srcImg.cols;Mat xMapImg = Mat::zeros(srcImg.size(), CV_32FC1);  //map1Mat yMapImg = Mat::zeros(srcImg.size(), CV_32FC1);  //map2for(int i = 0; i< rows; i++){for(int j = 0; j<cols; j++){xMapImg.at<float>(i, j) = j;  //保持列不变//yMapImg.at<float>(i, j) = i + 5 * sin(j/10.0); //波浪效果yMapImg.at<float>(i, j) = rows - i; //雪花效果}}remap(srcImg, dstImg, xMapImg, yMapImg, CV_INTER_LINEAR);imshow("src", srcImg);imshow("dst", dstImg);












原创粉丝点击