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

转自: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

原文地址:https://www.cnblogs.com/fx-blog/p/8244729.html

时间: 2024-10-29 15:52:42

[转]opencv3 图像处理 之 图像缩放( python与c++实现 )的相关文章

图像处理之基础---图像缩放中的一些 灰度插值算法

在图像缩放,旋转等一些图像处理中,对图像进行插值是不可缺少的一个步骤,下面对一些常用的插值算法进行介绍: 1.最近邻插值 这种插值方法是最简单的一种插值算法,图像输出的像素值的大小直接设为与其最邻近的点的大小即可,这个算法最简单,不需要多说,可以表示为 f(x,y) = g(  round(x)  ,   round(y)  ) 原图                                                                                  

视频图像处理基础知识0(双线性插值算法进行图像缩放)

双线性插值(说的很明白) 来自:http://www.cnblogs.com/linkr/p/3630902.html http://www.cnblogs.com/linkr/p/3630902.html 双线性插值,这个名字咋一听很高大上的样纸,再在维基百科上一查(见文末,我去,一堆的公式吓死人),像俺这种半文盲,看到公式脑子就懵的类型,真心给跪.虽然看着好复杂,但仔细一看道理再简单不过了,所以还是自己梳理一下好. 双线性插值,顾名思义就是两个方向的线性插值加起来(这解释过于简单粗暴,哈哈)

图像缩放_OpenCv

图像缩放是一种比较简单的图像处理操作,这里给出opencv中的代码, opencv的版本C语言接口 int resize_c() { const char *pstrImageName = "lena.jpg"; const char *pstrSaveImageName = "lena缩放图.jpg"; const char *pstrWindowsSrcTitle = "原图"; const char *pstrWindowsDstTitle

opencv2 矩阵方式 resize图像缩放代码(转载)

http://blog.sina.com.cn/s/blog_74a459380101r0yx.html opencv2 矩阵方式 resize图像缩放代码(转载) (2014-05-16 09:55:35) 转载▼   分类: Opencv_Function 最近学习opencv的时候遇到的一些技术问题,拿出来分享一下.opencv1和opencv2最大的区别就是c++支持,这使得网上有些资料是opencv1的c语言写的,而有些人喜欢c++,当然接口函数也就不同了.下面是一个c++的openc

实现基于最近邻内插和双线性内插的图像缩放

平时我们写图像处理的代码时,如果需要缩放图片,我们都是直接调用图像库的resize函数来完成图像的缩放.作为一个机器视觉或者图像处理算法的工作者,图像缩放代码的实现应该是必须掌握的.在众多图像缩放算法中,最近邻内插算法和双线性内插算法最为基本和常见,所以这篇文章就说一说如何用c++实现这两种算法下的 http://pic.cnhubei.com/space.php?uid=1132&do=album&id=823167http://pic.cnhubei.com/space.php?uid

图像缩放算法

图像缩放算法较多,下面仅以最邻近插值算法和双线性插值算法作介绍. 如下图1所示,表示原始图像和缩放以后的图像. 图1 图像缩放(原始图像à缩放图像) 图像缩放就是将原始图像中的点经过某一算法映射到目标图像的点的行为,即要找到目标图像中的点p1对应在原始图像中点p0,简单而言就是找点p0. 假设: 原始图像src的分辨率为(srcW * srcH): 目标图像dst的分辨率为(dstW * dstH). 那么: 原始图像宽与目标图像宽的比例 原始图像高与目标图像高的比例 由 所以,原始图像中的点p

图像处理之图像梯度效果(转载)

转载自:http://blog.csdn.net/jia20003/article/details/7664777 图像处理之图像梯度效果 基本思想: 利用X方向与Y方向分别实现一阶微分,求取振幅,实现图像梯度效果.关于如何计算图像 一阶微分参见这里:http://blog.csdn.net/jia20003/article/details/7562092 使用的两种微分算子分别为Prewitt与Sobel,其中Soble在X, Y两个方向算子分别为: Prewitt在X, Y方向上梯度算子分别

图像编程学习笔记7——图像缩放

假设放大因子为ratio,(为了避免新图过大或过小,我们在程序中限制0.25≤ratio≤4),缩放(zoom)的变换矩阵很简单: (2.13) 缩放变换的源代码如下,因为和转置的那段程序很类似,程序中的注释就简单一些. [cpp] view plaincopy /** * 函数名: zoom * 参  数: ratio -- 缩放率 * 功  能: 对图片进行水平和垂直镜像操作 *         只保存原图大小的图像数据,如果没有就用白色填充 */ void zoom(double rati

[转载]双线性插值算法进行图像缩放及性能效果优化

原文地址:双线性插值算法进行图像缩放及性能效果优化 一)转自http://handspeaker.iteye.com/blog/1545126 最近在编程时用到了双线性插值算法,对图像进行缩放.网上有很多这方面的资料,介绍的也算明白.但是,这些文章只介绍了算法,并没有具体说怎么实现以及怎么实现最好,举个例子,你可以按照网上文章的算法自己写一个双线性插值程序,用它对一张图片进行处理,然后再用matlab或者openCV的resize函数对同一张图片进行处理,得到的结果是不一样的,如果源图片较小,效