打印
[ARM9、LPC]

【Rayeager PX2分享】OpenCV入门之图像缩放

[复制链接]
1189|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 穿prada的008 于 2015-5-7 11:21 编辑

在实际应用中,我们经常需要将某种尺寸的图像转换为其他尺寸的图像,比如放大或缩小图像。实现图像缩放的功能主要涉及到两个关键的函数: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


感谢 Ickey电子工程社区fjjjnk1234的分享
代码文件:
image_resizing.rar (74.03 KB)



相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

95

帖子

1

粉丝