图像缩放与图像金字塔
视频讲解如下:
当前系列所有demo下载地址:
https://github.com/GaoRenBao/OpenCv4-Demo
不同编程语言对应的OpenCv版本以及开发环境信息如下:
语言 | OpenCv版本 | IDE |
C# | OpenCvSharp4.4.8.0.20230708 | Visual Studio 2022 |
C++ | OpenCv-4.5.5-vc14_vc15 | Visual Studio 2022 |
Python | OpenCv-Python (4.6.0.66) | PyCharm Community Edition 2022.1.3 |
本章节给大家讲讲如何对图像进行缩放。当前代码主体还是使用毛星云的demo,C#和Python都是在C++版本的基础上转换过来的,三个版本的效果基本一致。
这里提供了三种图像缩放方法:resize、pyrUp、pyrDown
C#版本代码
C#版本需要安装“OpenCvSharp4”、“OpenCvSharp4.runtime.win”两个库才行。不然会报错。
如果需要使用“ BitmapConverter.ToBitmap”操作,则需要追加安装“OpenCvSharp4.Extensions”库。
using OpenCvSharp;
using System;
using System.Windows.Forms;
namespace WindowsFormsApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Mat dstImage1 = new Mat();
Mat dstImage2 = new Mat();
Mat dstImage3 = new Mat();
Mat dstImage4 = new Mat();
// 载入原图
Mat srcImage = Cv2.ImRead("../../../images/dota_logo.jpg");
//显示原始图
Cv2.ImShow("【原始图】", srcImage);
// 使用resize进行尺寸调整操作
Cv2.Resize(srcImage, dstImage1,new Size(srcImage.Cols * 0.8, srcImage.Rows * 0.8),0, 0, InterpolationFlags.Area);
Cv2.Resize(srcImage, dstImage2, new Size(srcImage.Cols * 1.2, srcImage.Rows * 1.2),0, 0, InterpolationFlags.Area);
// 进行向上取样操作
Cv2.PyrUp(srcImage, dstImage3, new Size(srcImage.Cols * 2, srcImage.Rows * 2));
//进行向下取样操作
Cv2.PyrDown(srcImage, dstImage4, new Size(srcImage.Cols * 0.5, srcImage.Rows * 0.5));
//显示效果图
Cv2.ImShow("【效果图1】", dstImage1);
Cv2.ImShow("【效果图2】", dstImage2);
Cv2.ImShow("【效果图3】", dstImage3);
Cv2.ImShow("【效果图4】", dstImage4);
Cv2.WaitKey(0);
}
}
}
C++版本代码
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
Mat dstImage1, dstImage2, dstImage3, dstImage4;
// 载入原图
Mat srcImage = imread("../images/dota_logo.jpg");
//显示原始图
imshow("【原始图】", srcImage);
// 使用resize进行尺寸调整操作
resize(srcImage, dstImage1, Size(srcImage.cols * 0.8, srcImage.rows * 0.8), (0, 0), (0, 0), 3);
resize(srcImage, dstImage2, Size(srcImage.cols * 1.2, srcImage.rows * 1.2), (0, 0), (0, 0), 3);
// 进行向上取样操作
pyrUp(srcImage, dstImage3, Size(srcImage.cols * 2, srcImage.rows * 2));
//进行向下取样操作
pyrDown(srcImage, dstImage4, Size(srcImage.cols * 0.5, srcImage.rows * 0.5));
//显示效果图
imshow("【效果图1】", dstImage1);
imshow("【效果图2】", dstImage2);
imshow("【效果图3】", dstImage3);
imshow("【效果图4】", dstImage4);
waitKey(0);
return 0;
}
Python版本代码
import cv2
# 载入原图
srcImage = cv2.imread('../images/dota_logo.jpg')
# 显示原图
cv2.imshow('image', srcImage)
imgH = srcImage.shape[0]
imgW = srcImage.shape[1]
# 使用resize进行尺寸调整操作
dstImage1 = cv2.resize(srcImage, (int(imgW * 0.8), int(imgH * 0.8)), interpolation=cv2.INTER_NEAREST)
dstImage2 = cv2.resize(srcImage, (int(imgW * 1.2), int(imgH * 1.2)), interpolation=cv2.INTER_NEAREST)
# 进行向上取样操作
dstImage3 = cv2.pyrUp(srcImage, (imgW * 2, imgH * 2));
# 进行向下取样操作
dstImage4 = cv2.pyrDown(srcImage, (imgW * 0.5, imgH * 0.5));
# 显示效果图
cv2.imshow('dstImage1', dstImage1)
cv2.imshow('dstImage2', dstImage2)
cv2.imshow('dstImage3', dstImage3)
cv2.imshow('dstImage4', dstImage4)
cv2.waitKey(0)
cv2.destroyAllWindows()