C++ opencv圖像處理實現圖片幾何變換示例

簡介

圖像的幾何變換不改變圖像的像素值,而是改變像素所在的幾何位置,從變換的性質來分,圖像的幾何變換有圖像的位置變換(平移,鏡像,旋轉)、圖像的形狀變換(放大,縮小,錯切)等基本變換,以及圖像的復合變換等,

一、圖像平移

圖像平移是將一幅圖像中所有的點都按照指定的平移量在水平,垂直方向移動,平移後的圖像與原圖像相同,平移後的圖像上的每一個點都可以在原圖像中找到對應的點。圖像是由像素組成,假設原來的像素坐標為(x0,y0),經過平移量(△x,△y)坐標變為(x1,y1)

用數學可以表示:x1=x0+△x,y1=y0+△xy

平移變換分為兩種,一種是圖像大小改變,這樣最後的原圖像會有一部分不在圖像中,另一種是圖像大小改變,這樣可以保全原圖像的內容

1.圖像平移代碼 (不改變圖像大小)

#include<iostream>
#include<opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
	Mat img1;
	img1 = imread("貓1.jpg");
	imshow("原圖", img1);
	int r = img1.rows;
	int c = img1.cols;
	int x0 = 100;
	int y0 = 100;
	Mat img2(img1.size(), img1.type());
	for (int i = 0; i < r; i++)
	{
		for (int j = 0; j < c; j++)
		{
			int x = j - x0;
			int y = i - y0;
			if (x >= 0 && y >= 0 && x < c&&y < r)
			{
				img2.at<Vec3b>(i, j) = img1.ptr<Vec3b>(y)[x];
			}
		}
	}
	imshow("不改變圖像大小", img2);
	waitKey(0);
}

效果如下:

2.圖像平移代碼 (改變圖像大小)

代碼如下(示例):

int main()
{
	Mat img1;
	img1 = imread("貓1.jpg");
	imshow("原圖", img1);
	int x0 = 100;
	int y0 = 100;
	int r = img1.rows + y0;
	int c = img1.cols + x0;
	Mat img2(r,c, img1.type());
	for (int i = 0; i < r; i++)
	{
		for (int j = 0; j < c; j++)
		{
			int x = j - x0;
			int y = i - y0;
			if (x >= 0 && y >= 0 && x < c&&y < r)
			{
				img2.at<Vec3b>(i, j) = img1.ptr<Vec3b>(y)[x];
			}
		}
	}
	imshow("改變圖像大小", img2);
	waitKey(0);
}

效果如下:

二、圖像旋轉

圖像旋轉是數字圖像處理的一個非常重要的環節,是圖像的幾何變換的手法之一。一般圖像的旋轉是圖像的位置變換,但旋轉後,圖像的大小一般會改變。在圖像旋轉變換中,既可以把轉出顯示區域的圖像截去,也可以擴大圖像范圍以顯示所用的圖像。

1.圖像旋轉函數

opencv提供的getRotationMatrix2D函數來實現圖像旋轉,用來計算出旋轉矩陣。

Mat getRotationMatrix2D(Point2f center, double angle, double scale)
		center 旋轉中心點
		angle  旋轉的角度
		scale 圖像縮放因子

2.仿射變換函數

計算出旋轉矩陣後,還需要把旋轉應用到仿射變換的輸出,仿射變換函數是warpAffine

void warpAffine(InputArray src, OutputArray dst,
		InputArray M, Size dsize,
		int flags = INTER_LINEAR,
		int borderMode = BORDER_CONSTANT,
		const Scalar& borderValue = Scalar());
	src 輸入
	dst 輸出
	M 變換矩陣
	Size 尺寸
	flags 插值算法標識符
	borderMode 邊界像素模式
	borderValue 邊界取值

3.代碼

int main()
{
	Mat img1;
	img1 = imread("貓1.jpg");
	imshow("原圖", img1);
	Point center(img1.cols / 2, img1.rows / 2);
	Mat m = getRotationMatrix2D(center, 30, 0.5);
	Mat img2;
	warpAffine(img1, img2, m, img1.size());
	imshow("旋轉", img2);
	waitKey(0);
}

效果如下:

三、圖像縮放

圖像比例縮放是值將給定的圖像在x軸方向按比例縮放fx倍,在y軸方向按比例縮放fy倍

1.圖像縮放函數

void resize(InputArray src, OutputArray dst,
		Size dsize, double fx = 0, double fy = 0,
		int interpolation = INTER_LINEAR);
	src 輸入
	dst 輸出
	dsize 尺寸
	fx 在x軸縮放比例
	fy 在y軸縮放比例
	interpolation 插值方式

2.圖像縮小代碼

int main()
{
	Mat img1;
	img1 = imread("貓1.jpg");
	imshow("原圖", img1);
	Mat img2;
	resize(img1, img2, Size(img1.cols / 2, img1.rows / 2));
	imshow("縮小", img2);
	waitKey(0);
}

效果如下:

3.圖像放大代碼

int main()
{
	Mat img1;
	img1 = imread("貓1.jpg");
	imshow("原圖", img1);
	Mat img2;
	resize(img1, img2, Size(img1.cols * 2, img1.rows * 2));
	imshow("放大", img2);
	waitKey(0);
}

效果如下:

總結

本文簡單介紹瞭圖像平移,旋轉,縮放,這是最基本的調用函數解決,其中還有運用數學公式解決,這裡沒有介紹,有興趣的可以去瞭解瞭解,更多關於C++ opencv幾何變換的資料請關註LevelAH其它相關文章!

推薦閱讀: