1. 程式人生 > >【影象處理知識複習】10影象縮放到任意大小 C++實現

【影象處理知識複習】10影象縮放到任意大小 C++實現

演算法類似於前面講的點選開啟連結,不同的是,這個給定的是縮放後的影象大小,前面演算法給定的縮放比例。

條件:給出影象,和要縮放到的大小。

效果如下:


C++程式碼實現如下:

#include <opencv2/opencv.hpp>
using namespace cv;

Mat my_resize(const Mat &, int, int);

int main()
{
	Mat img = imread("D:/Code/Image/classic.jpg", 0);
	imshow("原圖", img);

	Mat new_img = my_resize(img, 200, 100); // (width, height),(col, row)
	imshow("縮放後效果", new_img);
	waitKey(0);
	return 0;
}

Mat my_resize(const Mat &img, int width, int height)
{
	// 1, 定義縮放後的影象大小,行列縮放比例
	Mat output = Mat::zeros(Size(width, height), CV_8UC1);
	float width_scale = (float)img.cols / width;     // 列縮放比例,相對於演算法前面講的k1
	float height_scale = (float)img.rows / height;   // 行縮放比例,即k2

	// 2, 取樣
	for (int i = 0; i < height; i++)  // 注意i,j的範圍, i < height * img.rows / height;
	{
		for (int j = 0; j < width; j++)  
		{
			output.at<uchar>(i, j) = img.at<uchar>(round(i * height_scale), round(j * width_scale));
		}
	}

	return output;

}