c# OpenCV 图像裁剪、调整大小、旋转、透视(三)

图像裁剪、调整大小、旋转、透视图像处理基本操作。

  1. croppedImage 图像裁剪
  2. Cv2.Resize() 调整图像大小
  3. 图像旋转
  • Cv2.Rotate()旋转
  • Cv2.Flip()翻转
  • Cv2.WarpAffine()任意角度旋转
  • Cv2.GetAffineTransform()透视

一、图像裁剪

Rect rect = new Rect(x, y, width, height); // x, y 为起始坐标,width, height 为裁剪宽高

|--------|-------|
| 参数 | 说明 |
| pt1 | 起始坐标x |
| pt2 | 起始坐标y |
| width | 终点坐标 |
| height | 直线的颜色 |

cs 复制代码
// 读取原始图像
Mat image = new Mat("1.png", ImreadModes.Color);
// 设置感兴趣区域的坐标和尺寸
Rect roi = new Rect(100, 100, 200, 200);//坐标 x,y 尺寸 长宽
// 裁剪图像
Mat croppedImage = new Mat(image, roi);
// 显示图片
Cv2.ImShow("image", image);
Cv2.ImShow("croppedImage", croppedImage);

二、调整图像大小

Cv2.Resize(src,OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR );

|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 参数 | 说明 |
| src | 输入,原图像,即待改变大小的图像 |
| dst | 输出,改变大小之后的图像,这个图像和原图像具有相同的内容,只是大小和原图像不一样而已 |
| dsize | * 输出图像的大小。如果这个参数不为0,那么就代表将原图像缩放到这个Size(width,height)指定的大小;如果这个参数为0,那么原图像缩放之后的大小就要通过下面的公式来计算: * dsize = Size(round(fx*src.cols), round(fy*src.rows)) * 其中,fx和fy就是下面要说的两个参数,是图像width方向和height方向的缩放比例。 * fx:width方向的缩放比例,如果它是0,那么它就会按照(double)dsize.width/src.cols来计算; * fy:height方向的缩放比例,如果它是0,那么它就会按照(double)dsize.height/src.rows来计算; |
| interpolation | 这个是指定插值的方式,图像缩放之后,肯定像素要进行重新计算的,就靠这个参数来指定重新计算像素的方式,有以下几种 * INTER_NEAREST - 最邻近插值 * INTER_LINEAR - 双线性插值,如果最后一个参数你不指定,默认使用这种方法 * INTER_AREA -区域插值 resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire'-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method. * INTER_CUBIC - 4x4像素邻域内的双立方插值 * INTER_LANCZOS4 - 8x8像素邻域内的Lanczos插值 |

cs 复制代码
 Mat srcImage = new Mat("1.png", ImreadModes.Color);
  // 临时变量和目标图的定义
 Mat dstImage1 = new Mat();
 Mat dstImage2 = new Mat();
 Mat dstImage3= new Mat();
 Mat dstImage4 = new Mat();
 //进行尺寸调整操作
 Cv2.Resize(srcImage, dstImage1, new OpenCvSharp.Size(srcImage.Cols / 2, srcImage.Rows / 2), (double)InterpolationFlags.Linear);
 Cv2.Resize(srcImage, dstImage2, new OpenCvSharp.Size(srcImage.Cols / 2, srcImage.Cols / 2), (double)InterpolationFlags.Area);
 Cv2.Resize(srcImage, dstImage3, new OpenCvSharp.Size(srcImage.Cols * 2, srcImage.Cols * 2), (double)InterpolationFlags.Cubic);
 Cv2.Resize(srcImage, dstImage4, new OpenCvSharp.Size(srcImage.Cols * 2, srcImage.Cols * 2), (double)InterpolationFlags.Linear);
 Cv2.ImShow("dstImage1", dstImage1);
 Cv2.ImShow("dstImage2", dstImage2);
 Cv2.ImShow("dstImage3", dstImage3);
 Cv2.ImShow("dstImage4", dstImage4);
OpenCV图像缩放resize各种插值方式的比较

三、图片旋转

  1. 左旋转90° Cv2.Rotate(src, dst, RotateFlags.Rotate90CounterClockwise);
  2. 右旋转90° Cv2.Rotate(src, dst, RotateFlags.Rotate90Clockwise);
  3. 旋转180° Cv2.Rotate(src, dst, RotateFlags.Rotate180);
  4. 垂直翻转 Cv2.Flip(src, dst, FlipMode.Y);
  5. 水平翻转Cv2.Flip(src, dst, FlipMode.X);
cs 复制代码
using OpenCvSharp;
using System;

class Program
{
    static void Main()
    {
        Mat src = new Mat("input.jpg", ImreadModes.Color);
        Mat dst = new Mat();
        Cv2.Rotate(src, dst, RotateFlags.Rotate90Clockwise);
        Cv2.ImShow("dst", dst);
        Cv2.WaitKey(0);
    }
}

6.任意角度旋转

Cv2.WarpAffine(

InputArray src, // 输入图像

OutputArray dst, // 输出图像

InputArray M, // 旋转矩阵

Size dsize, // 输出图像大小

int flags = INTER_LINEAR, // 像素插值方式

int borderMode = BORDER_CONSTANT, // 背景填充默认为常量

const Scalar & borderValue = Scalar() // 填充颜色默认为黑色

)

|--------------|-----------|
| 说明 |
| src | 输入图像 |
| dst | 输出图像 |
| M | 旋转矩阵 |
| dsize | 输出图像大小 |
| flags | 像素插值方式 |
| borderMode | 背景填充默认为常量 |
| const Scalar | 填充颜色默认为黑色 |

cs 复制代码
using OpenCvSharp;

Mat img = new Mat("1.png", ImreadModes.Grayscale);
Point2f center = new Point2f(img.Cols / 2f, img.Rows / 2f);
//使用了Cv2.GetRotationMatrix2D()函数构建旋转矩阵,然后使用Cv2.WarpAffine()函数进行仿射变换。
Mat matrix = Cv2.GetRotationMatrix2D(center, 45, 0.6);
Cv2.WarpAffine(img, img, matrix, img.Size());
Cv2.ImShow("img", img);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();

7.图像透视

Cv2.GetAffineTransform(srcPoints, dstPoints);

参数

src: 代表输入图像的三个点坐标, 形为:[[col_1, row_1], [col_2, row_2], [col_3, row_3]]

dst: 代表输出图像的三个点坐标, 形为:[[col_4, row_4], [col_5, row_5], [col_6, row_6]]

点1 由位置 [col_1, row_1] 移动到 [col_4, row_4]

点2 由位置 [col_2, row_2] 移动到 [col_5, row_5]

点3 由位置 [col_3, row_3] 移动到 [col_6, row_6]

cs 复制代码
using OpenCvSharp;

Mat src = new Mat("input.jpg", ImreadModes.Color);
Mat dst = new Mat();

Point2f[] srcPoints = new Point2f[]
{
    new Point2f(0, 0),
    new Point2f(src.Cols, 0),
    new Point2f(0, src.Rows)
};

Point2f[] dstPoints = new Point2f[]
{
    new Point2f(src.Cols * 0.0f, src.Rows * 0.33f),
    new Point2f(src.Cols * 0.85f, src.Rows * 0.25f),
    new Point2f(src.Cols * 0.15f, src.Rows * 0.7f)
};

Mat affineMatrix = Cv2.GetAffineTransform(srcPoints, dstPoints);
Cv2.WarpAffine(src, dst, affineMatrix, src.Size());

Cv2.ImShow("src", src);
Cv2.ImShow("dst", dst);
Cv2.WaitKey();

c# OpenCV 基本绘画(直线、椭圆、矩形、圆、多边形、文本)(四)
c# OpenCV 图像裁剪、调整大小、旋转、透视(三)

c#OpenCV 读取、显示和写入图像(二)

c# OpenCV安装(一)

相关推荐
StayInLove1 分钟前
G1垃圾回收器日志详解
java·开发语言
无尽的大道9 分钟前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
爱吃生蚝的于勒12 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
撞南墙者18 分钟前
OpenCV自学系列(1)——简介和GUI特征操作
人工智能·opencv·计算机视觉
binishuaio22 分钟前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE23 分钟前
【Java SE】StringBuffer
java·开发语言
就是有点傻28 分钟前
WPF中的依赖属性
开发语言·wpf
洋24036 分钟前
C语言常用标准库函数
c语言·开发语言
进击的六角龙38 分钟前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
wrx繁星点点39 分钟前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式