zoukankan      html  css  js  c++  java
  • opencv3 图像处理(一)图像缩放( python与c++ 实现)

    opencv3 图像处理 之 图像缩放( python与c++实现 )

    一. 主要函数介绍

    1) 图像大小变换 Resize ()

    原型:

    void Resize(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
    
  • 相关阅读:
    DEDECMS里面DEDE函数解析
    dede数据库类使用方法 $dsql
    DEDE数据库语句 DEDESQL命令批量替换 SQL执行语句
    织梦DedeCms网站更换域名后文章图片路径批量修改
    DSP using MATLAB 示例 Example3.12
    DSP using MATLAB 示例 Example3.11
    DSP using MATLAB 示例 Example3.10
    DSP using MATLAB 示例Example3.9
    DSP using MATLAB 示例Example3.8
    DSP using MATLAB 示例Example3.7
  • 原文地址:https://www.cnblogs.com/dyufei/p/8205121.html
Copyright © 2011-2022 走看看