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, double fy=0:表示x和y方向上变换大小的因素,当都是0的时候:
int interpolation=INTER_LINEAR :表示插值方法
• INTER_NN – 最近邻差值,
• INTER_LINEAR –
双线性差值 (缺省使用)
• INTER_AREA –
使用象素关系重采样。当图像缩小时候,该方法
可以避免波纹出现。当图像放大时,类似于
INTER_NN
方法..
• INTER_CUBIC –
立方差值.
1、最近邻:公式,
-
for
(
int
i = 0; i < matDst1.cols; ++i)
-
{
-
int
sx = cvFloor(i * scale_x);
-
sx = std::min(sx, matSrc.cols – 1);
-
for
(
int
j = 0; j < matDst1.rows; ++j)
-
{
-
int
sy = cvFloor(j * scale_y);
-
sy = std::min(sy, matSrc.rows – 1);
-
matDst1.at<cv::Vec3b>(j, i) = matSrc.at<cv::Vec3b>(sy, sx);
-
}
-
}
-
cv::imwrite(
“nearest_1.jpg”
, matDst1);
-
-
cv::resize(matSrc, matDst2, matDst1.size(), 0, 0, 0);
-
cv::imwrite(
“nearest_2.jpg”
, matDst2);
2、双线性:由相邻的四像素(2*2)计算得出,公式,
-
uchar* dataDst = matDst1.data;
-
int
stepDst = matDst1.step;
-
uchar* dataSrc = matSrc.data;
-
int
stepSrc = matSrc.step;
-
int
iWidthSrc = matSrc.cols;
-
int
iHiehgtSrc = matSrc.rows;
-
-
for
(
int
j = 0; j < matDst1.rows; ++j)
-
{
-
float
fy = (
float
)((j + 0.5) * scale_y – 0.5);
-
int
sy = cvFloor(fy);
-
fy -= sy;
-
sy = std::min(sy, iHiehgtSrc – 2);
-
sy = std::max(0, sy);
-
-
short
cbufy[2];
-
cbufy[0] = cv::saturate_cast<
short
>((1.f – fy) * 2048);
-
cbufy[1] = 2048 – cbufy[0];
-
-
for
(
int
i = 0; i < matDst1.cols; ++i)
-
{
-
float
fx = (
float
)((i + 0.5) * scale_x – 0.5);
-
int
sx = cvFloor(fx);
-
fx -= sx;
-
-
if
(sx < 0) {
-
fx = 0, sx = 0;
-
}
-
if
(sx >= iWidthSrc – 1) {
-
fx = 0, sx = iWidthSrc – 2;
-
}
-
-
short
cbufx[2];
-
cbufx[0] = cv::saturate_cast<
short
>((1.f – fx) * 2048);
-
cbufx[1] = 2048 – cbufx[0];
-
-
for
(
int
k = 0; k < matSrc.channels(); ++k)
-
{
-
*(dataDst+ j*stepDst + 3*i + k) = (*(dataSrc + sy*stepSrc + 3*sx + k) * cbufx[0] * cbufy[0] +
-
*(dataSrc + (sy+1)*stepSrc + 3*sx + k) * cbufx[0] * cbufy[1] +
-
*(dataSrc + sy*stepSrc + 3*(sx+1) + k) * cbufx[1] * cbufy[0] +
-
*(dataSrc + (sy+1)*stepSrc + 3*(sx+1) + k) * cbufx[1] * cbufy[1]) >> 22;
-
}
-
}
-
}
-
cv::imwrite(
“linear_1.jpg”
, matDst1);
-
-
cv::resize(matSrc, matDst2, matDst1.size(), 0, 0, 1);