在實際應用中,咱們常常須要將某種尺寸的圖像轉換爲其餘尺寸的圖像,好比放大或縮小圖像。實現圖像縮放的功能主要涉及到兩個關鍵的函數:cvResize和cvCreateImage。php
關鍵函數介紹:ios
1.cvResize算法
void cvResize(shell
const CvArr* src,app
CvArr* dst,函數
Int interpolation = CV_INTER_LINEARui
);spa
函數說明:事件
第一個參數表示輸入的圖像。圖片
第二個參數表示輸出的圖像。
第三個參數指定插值方法,默認爲線性插值法,可用的插值方法以下:
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的分享