代码实现:
#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