Opencv2.4学习::图像缩放

 

代码实现:

#include<iostream>
#include"opencv2/imgproc/imgproc.hpp"
#include"opencv2/highgui/highgui.hpp"
#include<opencv2/core/core.hpp>
using namespace std;
using namespace cv;
//基于等间隔提取图像缩放
Mat imageReduction1(Mat &srcImage, double kx, double ky)
{
	//计算输出图像分辨率,取整数
	int nRows = cvRound(srcImage.rows*kx);
	int nCols = cvRound(srcImage.cols*ky);
	Mat resultImage(nRows, nCols, srcImage.type());
	for (int i = 0; i < nRows; ++i){
		for (int j = 0; j < nCols; ++j){
			//根据水平因子计算坐标
			int x = static_cast<int>((i + 1) / kx + 0.5) - 1;
			//根据垂直因子计算坐标
			int y = static_cast<int>((j + 1) / ky + 0.5) - 1;
			resultImage.at<cv::Vec3b>(i, j) =
				srcImage.at<cv::Vec3b>(x, y); //按间隔取原图像像素
			//并存到输出图像中
		}
	}
	return resultImage;
}
Vec3b areaAverage(const cv::Mat &srcImage,
	Point_<int> leftPoint, Point_<int> rightPoint)
{
	int temp1 = 0, temp2 = 0, temp3 = 0;
	//计算区域子块像素点个数
	int nPix = (rightPoint.x - leftPoint.x + 1)*(rightPoint.y -
		leftPoint.y + 1);
	//对区域子块各个通道对像素值求和
	for (int i = leftPoint.x; i <= rightPoint.x; i++){
		for (int j = leftPoint.y; j <= rightPoint.y; j++){
			temp1 += srcImage.at<cv::Vec3b>(i, j)[0];
			temp2 += srcImage.at<cv::Vec3b>(i, j)[1];
			temp3 += srcImage.at<cv::Vec3b>(i, j)[2];
		}
	}
	//对各通道求均值
	Vec3b vecTemp;
	vecTemp[0] = temp1 / nPix;
	vecTemp[1] = temp2 / nPix;
	vecTemp[2] = temp3 / nPix;
	return vecTemp;
}
Mat imageReduction2(const Mat &srcImage, double kx, double ky)
{
	//计算输出图像分辨率,取整数
	int nRows = cvRound(srcImage.rows*kx);
	int nCols = cvRound(srcImage.cols*ky);
	Mat resultImage(nRows, nCols, srcImage.type());
	//区域子块的左上角行列坐标
	int leftRowCoordinate = 0;
	int leftColCoordinate = 0;
	for (int i = 0; i < nRows; ++i){
		//根据水平因子计算坐标
		int x = static_cast<int>((i + 1) / kx + 0.5) - 1;
		for (int j = 0; j < nCols; ++j){
			//根据垂直因子计算坐标
			int y = static_cast<int>((j + 1) / ky + 0.5) - 1;
			//求解区域子块均值
			resultImage.at<cv::Vec3b>(i, j) =
				areaAverage(srcImage, Point_<int>(leftRowCoordinate, leftColCoordinate), Point_<int>(x, y));
			//更新下个子块的左上角列坐标,行坐标不变,即向右滑动
			leftColCoordinate = y + 1;
		}
		leftColCoordinate = 0;
		leftRowCoordinate = x + 1;
	}
	return resultImage;
}
int main()
{
	//用mat读取
	Mat mat_pic2 = imread("1.jpg");
	if (mat_pic2.empty()){
		cout << "pic is empty" << endl;
		return 1;
	}
	//显示
	imshow("ori_pic2", mat_pic2);
	Mat result = imageReduction2(mat_pic2, 0.501, 0.50); //不知为什么两个都设成0.5的话报错
	imshow("result_liner", result);
	//按下esc 保存
	if (waitKey(-1) == 27){
		imwrite("save.jpg", mat_pic2);
	}
	return 0;
}

 Opencv2.4 内置函数:resize()

#include<iostream>
#include"opencv2/imgproc/imgproc.hpp"
#include"opencv2/highgui/highgui.hpp"
#include<opencv2/core/core.hpp>
using namespace std;
using namespace cv;

/************************************************************************/
/*
OpenCV图像缩放使用的函数是:resize
void resize(InputArray src, OutputArray dst, Size dsize, 
double fx=0, double fy=0, int interpolation=INTER_LINEAR )
参数含义:
InputArray src     -原图像
OutputArray dst    -输出图像
Size dsize         -目标图像的大小
double fx=0        -在x轴上的缩放比例
double fy=0        -在y轴上的缩放比例
int interpolation  -插值方式,有以下四种方式
INTER_NN      -最近邻插值
INTER_LINEAR  -双线性插值 (缺省使用)
INTER_AREA    -使用象素关系重采样,当图像缩小时候,
该方法可以避免波纹出现。当图像放大时,类似于 INTER_NN 方法。
INTER_CUBIC   -立方插值。
说明:dsize与fx和fy必须不能同时为零
*/
/************************************************************************/
int main()
{
	//用mat读取
	Mat mat_pic2 = imread("F:\\opencv_re_learn\\2.jpg");
	if (mat_pic2.empty()){
		cout << "pic is empty" << endl;
		system("pause");
		return -1;
	}
	imshow("ori_pic2", mat_pic2);//原图像显示
	Mat result;
	resize(mat_pic2, result, Size(mat_pic2.cols/2, mat_pic2.rows/2),
		0, 0, INTER_LINEAR);// X Y各缩小一半
	imshow("result_liner", result);//显示缩放过后的结果
	//按下esc 保存
	if (waitKey(-1) == 27){
		imwrite("save.jpg", result);
	}
	return 0;
}

/************************************************************************/
OpenCV图像缩放使用的函数是:resize
void resize(InputArray src, OutputArray dst, Size dsize, 
double fx=0, double fy=0, int interpolation=INTER_LINEAR )
参数含义:
InputArray src     -原图像
OutputArray dst    -输出图像
Size dsize         -目标图像的大小
double fx=0        -在x轴上的缩放比例
double fy=0        -在y轴上的缩放比例
int interpolation  -插值方式,有以下四种方式
INTER_NN      -最近邻插值
INTER_LINEAR  -双线性插值 (缺省使用)
INTER_AREA    -使用象素关系重采样,当图像缩小时候,
该方法可以避免波纹出现。当图像放大时,类似于 INTER_NN 方法。
INTER_CUBIC   -立方插值。
说明:dsize与fx和fy必须不能同时为零
/************************************************************************/

需要注意的是: 
dsize是一个Size类型的数据,它包含图像的长和宽,而fx和fy为double类型,值反应图像的长或宽的比例。所以dsize和fx,fy必须不能同时为零,也就是说要么dsize不为零而fx与fy同时可以为0,要么dsize为0而fx与fy不同时为0

猜你喜欢

转载自blog.csdn.net/dieju8330/article/details/82317864
今日推荐