图像的平移比较简单,不多说。图像的缩放有多种方法,在此采用双线性插值方法,至于具体的算法原理,维基上讲的很好,主要是配图比较明了,网上的其他地方也有很多类似的文章以作参考,我在学习这个算法时在网上也查找了一些这方面的资料,发现比较多的是讲理论,上代码的不多,当然理论很重要啦,本文希望改善这一状况,本文结合C++和OpenCV来实现这些功能。
1、图像平移不改变图像宽高
Mat TranslationInvarianceImWH(Mat Image, int OffsetX, int OffsetY)
{
int m = Image.rows;
int n = Image.cols;
Mat ResultImage(m, n, Image.type());
for (int i = 0; i < m; i++)
{
int y = (i + OffsetY);
for (int j = 0; j < n; j++)
{
int x = (j + OffsetX);
if (y< m && x< n)
{
//ResultImage.at<Vec3b>(y, x) = Image.ptr<Vec3b>(i)[j];
ResultImage.ptr<Vec3b>(y)[x] = Image.ptr<Vec3b>(i)[j];
}
}
}
return ResultImage;
}
2、图像平移改变宽高
Mat TranslationChangeImWH(Mat Image,int OffsetX, int OffsetY)
{
int m = Image.rows;
int n = Image.cols;
int m1=m + abs(OffsetY);
int n1=n + abs(OffsetX);
Mat ResultImage(m1,n1,Image.type());
for (int i = 0; i < m; i++)
{
int y = (i + OffsetY);
for (int j = 0; j < n; j++)
{
int x = (j + OffsetX);
if ( y< m1 && x< n1)
{
ResultImage.at<Vec3b>(y, x) = Image.ptr<Vec3b>(i)[j];
}
}
}
return ResultImage;
}
3、图像缩放
Mat ResizeImage(Mat Image, float Scale)
{
int m = Image.rows;
int n = Image.cols;
int m1 = floor(m*Scale);
int n1 = floor(n*Scale);
float ScaleY = float(m1) / float(m);
float ScaleX = float(n1) / float(n);
Mat ResultImage = Mat::zeros(m1, n1, CV_32FC3);
Image.convertTo(Image, CV_32FC3);
for (int i = 0; i < m1; i++)
{
float InvY = float(i) / ScaleY;
float Y = floor(InvY);
float Dy = InvY - Y;
for (int j = 0; j < n1; j++)
{
float InvX = float(j) / ScaleX;
float X = floor(InvX);
float Dx = InvX - X;
int x = int(X);
int y = int(Y);
ResultImage.ptr<Vec3f>(i)[j] = (1 - Dy)*(1 - Dx)*Image.ptr<Vec3f>(y)[x]
+ Dy*(1 - Dx)*Image.ptr<Vec3f>(y + 1)[x] + (1 - Dy)*Dx*Image.ptr<Vec3f>(y)[x + 1]
+ Dy*Dx*Image.ptr<Vec3f>(y + 1)[x + 1];
}
}
Mat ResultImage1;
ResultImage.convertTo(ResultImage1, CV_8UC3);
return ResultImage1;
}
主函数调用演示:
int main()
{
int OffsetX = 100;
int OffsetY=200;
// 读入一张图片
Mat Image = imread("E:\\PublicPicture\\building1.JPG",1);
if (!Image.data)
return -1;
imshow("原始图像",Image);
Mat ResultImg;
//平移1
ResultImg = TranslationInvarianceImWH(Image, OffsetX, OffsetY);
imshow("变化后的图1", ResultImg);
//平移2
ResultImg = TranslationChangeImWH(Image, OffsetX, OffsetY);
imshow("变化后的图2", ResultImg);
//我的缩放,双线性插值法
ResultImg=ResizeImage(Image, 0.5);
imshow("变化后的图3", ResultImg);
//resize 函数缩放
Mat Imresize;
resize(Image, Imresize, Size(0, 0),0.5,0.5);
imshow("变化后的图4", Imresize);
waitKey(0);
return 0;
}
注册账号很久了,但没写过一点东西,各种拖延,今天终于开了个篇,万事开头难,以后会坚持写一些在这方面的东西,和社区的人一起学习交流。
新人新篇,如有不当处勿喷,望指正。