在实际应用中,我们经常需要将某种尺寸的图像转换为其他尺寸的图像,比如放大或缩小图像。实现图像缩放的功能主要涉及到两个关键的函数:cvResize和cvCreateImage。
关键函数介绍:
1.cvResize
void cvResize(
const CvArr* src,
CvArr* dst,
Int interpolation = CV_INTER_LINEAR
);
函数说明:
第一个参数表示输入的图像。
第二个参数表示输出的图像。
第三个参数指定插值方法,默认为线性插值法,可用的插值方法如下:
CV_INTER_NN 含义:最近邻插值
CV_INTER_LINER 含义:线性插值
CV_INTER_AREA 含义:区域插值
CV_INTER_CUBIC 含义:三次样条插值
一般情况下,我们期望源图像和重采样后的目标图像之间的映射尽可能地平滑。参数interpolation就是控制如何进行映射。当缩小图像时,目标图像的像素会映射为源图像中的多个参数,这时需要进行插值。当放大图像时,目标图像上的像素可能无法在源图像中找到精确对应的像素,也需要进行插值。最简单的方法试将目标图像各点的像素值设为源图像中与其距离最近的像素值,这就是当interpolation设为CV_INTER_NN时用的算法。
采用线性插值算法(CV_INTER_LINER),将根据源图像附件的4个邻近像素的线性加权计算得出,权重由这4个像素到精确目标点的距离决定。
采用区域插值(CV_INTER_AREA)是用新的像素点覆盖原来的像素点,然后求取覆盖区域的平均值。
采用三次样条插值(CV_INTER_CUBIC)是对源图像附件的4X4个邻近像素进行三次样条拟合,然后将目标像素对应的三次样条值作为目标图像对应像素点的值。
2. cvCreateImage
函数原型:
IplImage* cvCreateImage(CvSize size, intdepth, intchannels);
函数说明:
第一个参数表示图像的大小;
第二个参数表示图像的深度;
第三个参数表示图像的通道数。
以下是使用OpenCV进行图像缩放的程序。
image_resizing.cpp
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace std;
int main(int argc,char **argv)
{
const char *pstrImageName = "Rayeager_PX2.jpg";
const char *pstrSaveImageName = "Rayeager_PX2_Resizing.jpg";
const char *pstrWindowsSrcTitle = "initial";
const char *pstrWindowsDstTitle = "resizing";
double fScale = 0.314;//缩放倍数
CvSize czSize;//目标图像尺寸
//从文件中读取图像
IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);
IplImage *pDstImage = NULL;
//计算目标图像大小
czSize.width = pSrcImage->width * fScale;
czSize.height = pSrcImage->height * fScale;
//创建图像并缩放
pDstImage = cvCreateImage(czSize, pSrcImage->depth, pSrcImage->nChannels);
cvResize(pSrcImage, pDstImage, CV_INTER_AREA);
//创建窗口
cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
cvNamedWindow(pstrWindowsDstTitle, CV_WINDOW_AUTOSIZE);
//在指定窗口中显示图像
cvShowImage(pstrWindowsSrcTitle, pSrcImage);
cvShowImage(pstrWindowsDstTitle, pDstImage);
//等待按键事件
cvWaitKey();
//保存图片
cvSaveImage(pstrSaveImageName, pDstImage);
//销毁显示图像文件的窗口
cvDestroyWindow(pstrWindowsSrcTitle);
cvDestroyWindow(pstrWindowsDstTitle);
//释放为图像分配的内存
cvReleaseImage(&pSrcImage);
cvReleaseImage(&pDstImage);
return 0;
}
makefile:
INCLUDE = $(shell pkg-config --cflags opencv)
LIBS = $(shell pkg-config --libs opencv)
SOURCES = image_resizing.cpp
# 目标文件
OBJECTS = $(SOURCES:.cpp=.o)
# 可执行文件
TARGET = image_resizing
$(TARGET):$(OBJECTS)
g++ -o $(TARGET) $(OBJECTS) -I $(INCLUDE) $(LIBS)
$(OBJECTS):$(SOURCES)
g++ -c $(SOURCES)
clean:
rm $(OBJECTS) $(TARGET)
# 编译规则 $@代表目标文件 $< 代表第一个依赖文件
%.o:%.cpp
g++ -I $(INCLUDE) -o $@ -c $<
在源代码所在的文件夹中make生成可执行文件image_resizing,之后./image_resizing Rayeager_PX2.jpg就能实现图像缩放,并且缩放的图像保存在当前文件夹中,文件名为Rayeager_PX2_Resizing.jpg
代码:
image_resizing.rar
感谢 Ickey电子工程社区fjjjnk1234的分享