您的位置:首页 > 编程语言 > C语言/C++

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

2018-01-05 16:02 831 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: