1. 程式人生 > >[轉]opencv3 圖像處理 之 圖像縮放( python與c++實現 )

[轉]opencv3 圖像處理 之 圖像縮放( python與c++實現 )

space original 註意 libs 波紋 輸出 uil iostream 3.5

轉自:https://www.cnblogs.com/dyufei/p/8205121.html

一. 主要函數介紹

1) 圖像大小變換 cvResize ()

原型:

voidcvResize(const CvArr* src,CvArr* dst,intinterpolation=CV_INTER_LINEAR
);

說明:

src 表示輸入圖像。
dst表示輸出圖像。
intinterpolation插值方法,有以下四種:

CV_INTER_NN - 最近鄰插值,
CV_INTER_LINEAR - 雙線性插值 (缺省值)
CV_INTER_AREA - 使用象素關系重采樣。當圖像縮小時候,該方法可以避免波紋出現。當圖像放大時,類似於 CV_INTER_NN 方法..
CV_INTER_CUBIC - 立方插值.

2)圖像讀取 imread()

原型:

python:
     cv2.imread(filename[, flags]) → retval
c++:
    Mat imread(const string& filename, int flags=1 )

說明:

filename 表示圖像的路徑和名稱(不在工作路徑要提供絕對路徑,否則讀不到也不會報錯)
params 表示 的加載方式
python:

cv2.IMREAD_COLOR:讀入一副彩色圖像。圖像的透明度會被忽略, 這是默認參數。
cv2.IMREAD_GRAYSCALE:以灰度模式讀入圖像

c++:

CV_LOAD_IMAGE_COLOR 彩色
CV_LOAD_IMAGE_GRAYSCALE 灰度

3)圖像創建 imwrite()

原型:

python:
 cv2.imwrite(filename, image[, params]) 
c++:
    bool imwrite(const string& filename, InputArray image, const vector<int>& params=vector<int>())

說明:

filename 表示寫圖像的路徑和名稱(不在工作路徑要提供絕對路徑)
image 是要保存的圖像數據
params 表示 圖像保存方式python可以不用提供,但C++必須根據根式設置正確,否則保存不了圖片。

註意: C++ 中 imwrite(函數的) params參數 :

參數與保存的圖像類型相關,如果參數未指定文件保存不成功,具體根據保存的圖像類型具體設置

1)JPEG,參數為CV_IMWRITE_JPEG_QUALITY,它的值是從0到100,值越小壓縮的越多,默認值是95.
2)PNG,參數為CV_IMWRITE_PNG_COMPRESSION,它的值是從0到9,值越大表示圖片尺寸越小,壓縮時間越長。默認值是3。
3)PPM,PGM或者PBM,參數為CV_IMWRITE_PXM_BINARY,它的值是0或者1。默認值是1。

二、實例

python版(python3.5 opencv3.4):

import numpy as np
import cv2

def resizeImage(image,width=None,height=None,inter=cv2.INTER_AREA):
    newsize = (width,height)
    #獲取圖像尺寸
    (h,w) = image.shape[:2]
    if width is None and height is None:
        return image
    #高度算縮放比例
    if width is None:
        n = height/float(h)
        newsize = (int(n*w),height)
    else :
        n = width/float(w)
        newsize = (width,int(h*n))

        
    # 縮放圖像
    newimage = cv2.resize(image, newsize, interpolation=inter)
    return newimage

imageOriginal = cv2.imread("test.jpg")
cv2.imshow("Original", imageOriginal)
#獲取圖像尺寸
w = width=imageOriginal.shape[1]
h = width=imageOriginal.shape[2]
print ("Image size:",w,h)
#放大2倍
newimage = resizeImage(imageOriginal,w*2,h*2,cv2.INTER_LINEAR)
cv2.imshow("New", newimage)
#保存縮放後的圖像
cv2.imwrite(‘newimage.jpg‘,newimage)
#縮小5倍
newimage2 = resizeImage(imageOriginal,int(w/5),int(h/5),cv2.INTER_LINEAR)
cv2.imwrite(‘newimage2.jpg‘,newimage2)

C++ 版(imageResize.cpp)

#include <iostream>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

void imageResize(Mat image, Mat* dst, int width, int height, int inter = CV_INTER_AREA )
{
    
    int w = image.cols;
    int h = image.rows;
    int newW = width; 
    int newH = height;
    if(width == 0 && height ==0){
        return;
    }
    if(width == 0){
        float re = h/(float)height;
        newW = (int) w * re;
    } else {
        float re = w/(float)width;
        newH = (int) h * re;;
    }
    
    resize(image, *dst, Size(newW, newH),inter);

    
}

int main()  
{  
    const char* filename = "test.jpg";
    Mat image,dst;
    //image = imread(filename, CV_LOAD_IMAGE_GRAYSCALE);
    image = imread(filename, CV_LOAD_IMAGE_COLOR);
    if (image.empty()) {
        std::cout<<"Faild open file.";
    }
    //imshow("image", image);
    //image.cols為圖像的寬度 image.cols為圖像的高度
    int w = image.cols;
    int h = image.rows;
    std::cout<<"Image size:"<<w <<" * "<<h<<std::endl;
    imageResize(image,&dst,w * 2, h * 2);
    
    std::cout<<"new Image size:"<<dst.cols <<" * "<<dst.rows<<std::endl;
    vector<int> compression_params;
    //JPEG,參數為CV_IMWRITE_JPEG_QUALITY,值是從0到100,值越小壓縮的越多
    compression_params.push_back(CV_IMWRITE_JPEG_QUALITY);
    compression_params.push_back(100);
    //imshow("dstImage", dst);
    imwrite("dstImage.jpg",dst,compression_params);

    
    return 0;  
}  

編譯:

 sudo g++ imageResize.cpp  -o resize  `pkg-config --cflags --libs opencv

[轉]opencv3 圖像處理 之 圖像縮放( python與c++實現 )