Opencv 基础(四):使用OpenCV进行图像旋转和平移

这篇具有很好参考价值的文章主要介绍了Opencv 基础(四):使用OpenCV进行图像旋转和平移。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Opencv 基础(四):使用OpenCV进行图像旋转和平移
如今,图像编辑变得越来越流行,因为手机有内置的功能,可以让你裁剪、旋转和更多的操作你的图像。

这篇文章中,我们将探索和学习这些图像编辑技术。具体来说,我们将学习如何:

  • 旋转图像
  • 移动图像

基本图像变换操作

图像旋转和平移是图像编辑中最基本的操作之一。两者都属于广义的仿射变换。因此,在学习更复杂的转换之前,你应该首先学习旋转和平移图像,使用OpenCV中可用的函数。看看下面的图片,我们将在这里的所有转换示例中使用它。
Opencv 基础(四):使用OpenCV进行图像旋转和平移
让我们先看看下面的代码,它将用于使用OpenCV执行图像旋转。
Python

import cv2

# Reading the image
image = cv2.imread('image.jpg')

# dividing height and width by 2 to get the center of the image
height, width = image.shape[:2]
# get the center coordinates of the image to create the 2D rotation matrix
center = (width/2, height/2)

# using cv2.getRotationMatrix2D() to get the rotation matrix
rotate_matrix = cv2.getRotationMatrix2D(center=center, angle=45, scale=1)

# rotate the image using cv2.warpAffine
rotated_image = cv2.warpAffine(src=image, M=rotate_matrix, dsize=(width, height))

cv2.imshow('Original image', image)
cv2.imshow('Rotated image', rotated_image)
# wait indefinitely, press any key on keyboard to exit
cv2.waitKey(0)
# save the rotated image to disk
cv2.imwrite('rotated_image.jpg', rotated_image)

C++

#include <iostream>
#include<opencv2/opencv.hpp>
using namespace cv;

int main(int, char**) 
{
    Mat image = imread("image.jpg");
	  imshow("image", image);
	  waitKey(0);
	  double angle = 45;

	  // get the center coordinates of the image to create the 2D rotation matrix
	  Point2f center((image.cols - 1) / 2.0, (image.rows - 1) / 2.0);
	  // using getRotationMatrix2D() to get the rotation matrix
	  Mat rotation_matix = getRotationMatrix2D(center, angle, 1.0);

	  // we will save the resulting image in rotated_image matrix
	  Mat rotated_image;
	  // rotate the image using warpAffine
	  warpAffine(image, rotated_image, rotation_matix, image.size());
	  imshow("Rotated image", rotated_image);
    // wait indefinitely, press any key on keyboard to exit
	  waitKey(0);
	  // save the rotated image to disk
	  imwrite("rotated_im.jpg", rotated_image);

	  return 0;
}

使用OpenCV进行图像旋转

通过定义一个变换矩阵M,你可以将图像旋转一个特定的角度θ。这个矩阵通常是这样的:
Opencv 基础(四):使用OpenCV进行图像旋转和平移
OpenCV提供了为图像定义旋转中心的能力,以及一个缩放因子来调整图像的大小。在这种情况下,变换矩阵如下。
Opencv 基础(四):使用OpenCV进行图像旋转和平移
在上述矩阵中:
Opencv 基础(四):使用OpenCV进行图像旋转和平移
其中 c x c_x cx c y c_y cy是图像旋转所沿的坐标。

OpenCV提供了getRotationMatrix2D()函数来创建上面的转换矩阵。
以下是创建2D旋转矩阵的语法:

getRotationMatrix2D(center, angle, scale)

getRotationMatrix2D()函数接受以下参数:

  • center:图像的旋转中心:
  • angle: 旋转角度:
  • scale :一个各向同性的比例因子,根据提供的值将图像向上或向下缩放

如果angle是正的,图像将逆时针方向旋转。如果你想顺时针旋转图像相同的量,那么角度需要是负的。

旋转分为三步操作:
1. 首先,你需要得到旋转的中心。这通常是你要旋转的图像的中心。
2. 接下来,创建2d旋转矩阵。OpenCV提供了我们在上面讨论过的getRotationMatrix2D()函数。
3. 最后,使用在上一步中创建的旋转矩阵对图像应用仿射变换。OpenCV中的warpAffine()函数完成这项工作。

warpAffine()函数的作用是:对图像应用一个仿射变换。在进行仿射变换后,原图像中所有的平行线在输出图像中也保持平行。

warpAffine()的完整语法如下所示

warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])

下面是函数的参数:

  • src:原图
  • M:变换矩阵
  • dsize:输出图像的大小
  • dst:输出图像
  • flags: 插值方法的组合如INTER_LINEAR或INTER_NEAREST
  • borderMode:像素扩展方法
  • borderValue:在边界不变的情况下使用的值,默认值为0

注意:你可以在这里了解更多关于OpenCV仿射转换的信息

旋转后的图片
Opencv 基础(四):使用OpenCV进行图像旋转和平移

使用OpenCV平移图像

在计算机视觉中,图像的平移意味着沿着x轴和y轴移动指定数量的像素。设图像需要移动的像素为tx和ty,则可以定义一个平移矩阵M:
Opencv 基础(四):使用OpenCV进行图像旋转和平移
现在,在通过tx和ty值移动图像时,有几点你应该记住。

  • 为tx提供正值将使图像向右移动,而负值将使图像向左移动。
  • 同样,ty值为正值时,图像会向下平移,而ty值为负值时,图像会向上平移。

按照以下步骤使用OpenCV平移图片:

  • 首先读取图像,获得图像的宽度和高度。
  • 接下来,像旋转一样,创建一个变换矩阵,这是一个2D数组。这个矩阵包含沿x轴和y轴移动图像所需的信息。
  • 同样,在旋转中,在最后一步中使用warpAffine()函数来应用仿射转换。

仔细阅读这段代码,看看它有多简单:

Python

import cv2 
import numpy as np

# read the image 
image = cv2.imread('image.jpg')
# get the width and height of the image
height, width = image.shape[:2]

C++

#include "opencv2/opencv.hpp"
using namespace cv
// read the image 
Mat image = imread("image.jpg");
// get the height and width of the image
int height = image.cols;
int width = image.rows;

在上面的代码块中,您读取图像并获得其高度和宽度。
接下来,创建平移矩阵

Python

# get tx and ty values for translation
# you can specify any value of your choice
tx, ty = width / 4, height / 4

# create the translation matrix using tx and ty, it is a NumPy array 
translation_matrix = np.array([
    [1, 0, tx],
    [0, 1, ty]
], dtype=np.float32)

C++

// get tx and ty values for translation
float tx = float(width) / 4;
float ty = float(height) / 4;
// create the translation matrix using tx and ty
float warp_values[] = { 1.0, 0.0, tx, 0.0, 1.0, ty };
Mat translation_matrix = Mat(2, 3, CV_32F, warp_values);

对于平移矩阵,如上所述,您将需要tx和ty。在本例中,您使用宽度和高度的四分之一作为平移值。我们建议您尝试不同的值并研究它们的输出。

现在,使用warpAffine()函数将平移矩阵应用到图像上,就像对旋转所做的那样。

Python

# apply the translation to the image
translated_image = cv2.warpAffine(src=image, M=translation_matrix, dsize=(width, height))

C++

// save the resulting image in translated_image matrix
Mat translated_image;
// apply affine transformation to the original image using the translation matrix
warpAffine(image, translated_image, translation_matrix, image.size());

注意:warpAffine()是一个通用函数,可以用于对图像应用任何类型的仿射变换。只要适当地定义矩阵M。

最后的代码块将显示转换后的图像,并将其写入磁盘。

Python

# display the original and the Translated images
cv2.imshow('Translated image', translated_image)
cv2.imshow('Original image', image)
cv2.waitKey(0)
# save the translated image to disk
cv2.imwrite('translated_image.jpg', translated_image)

C++

//display the original and the Translated images
imshow("Translated image", translated_image);
imshow("Original image", image);
waitKey(0);
// save the translated image to disk
imwrite("translated_image.jpg", translated_image);

下图显示了平移后的图像。
Opencv 基础(四):使用OpenCV进行图像旋转和平移文章来源地址https://www.toymoban.com/news/detail-454267.html

到了这里,关于Opencv 基础(四):使用OpenCV进行图像旋转和平移的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV中图像的平移、旋转、倾斜、透视的讲解与实战(附Python源码)

    需要源码请点赞关注收藏后评论区留言私信~~~ 仿射变换是一种仅在二维平面中发生的几何变形,变换之后的图形仍然可以保持直线的平直性和平行性,也就是说原来的直线变换之后还是直线,平行线变换之后还是平行线,常见的仿射变换包括平移 旋转和倾斜 OpenCV通过cv2.wa

    2024年02月03日
    浏览(42)
  • (opencv)图像几何变换——平移

    图像的平移操作是将图像的所有像素坐标进行水平或垂直方向移动,也就是将所有像素点按照给定的偏移量在水平方向沿x轴、垂直方向上沿y轴移动。平移变换分为两种类型:图像大小变化与图像大小不变。第一种类型保证图像平移的完整信息,第二种图像导致原始图像的部

    2024年02月08日
    浏览(30)
  • 【OpenCV • c++】图像几何变换 | 图像平移

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪

    2024年02月16日
    浏览(23)
  • Python Opencv实践 - 图像平移

     

    2024年02月13日
    浏览(25)
  • 【C++】【Opencv】cv::warpAffine()仿射变换函数详解,实现平移、缩放和旋转等功能

    仿射变换是一种二维变换,它可以将一个二维图形映射到另一个二维图形上,保持了图形的“形状”和“大小”不变,但可能会改变图形的方向和位置。仿射变换可以用一个线性变换矩阵来表示,该矩阵包含了六个参数,可以进行平移、缩放、旋转等操作。通过原理、函数和

    2024年02月05日
    浏览(31)
  • 使用OpenCV对旋转矩形区域的内容进行裁剪

    再做OCR的时候,我想单独把矩形的区域裁剪出来,因此对这个问题进行了一些探索,最后得到的具体步骤如下: 使用cv2.minAreaRect()函数获取旋转矩形的中心点、宽度、高度和旋转角度信息。 使用cv2.getRotationMatrix2D()函数获取旋转矩阵。 使用cv2.warpAffine()函数根据旋转矩阵进行旋

    2024年02月15日
    浏览(32)
  • OpenCV(图像处理)-基于Python-图像的基本变换-平移-翻转-仿射变换-透视变换

    为了方便开发人员的操作,OpenCV还提供了一些图像变换的API,本篇文章讲简单介绍各种API的使用,并附上一些样例。 图像缩放函数,用于把图像按指定的尺寸放大或缩小。 dst = cv2.resize(src, dsize, fx, fy, interpolation) dst = 生成的目的图像 src:需要变换的原图像 disize:(x, y)需要

    2024年02月08日
    浏览(38)
  • C#使用Matrix类对Dicom图像的旋转、平移、翻转

    使用Matrix对图像的旋转、平移、翻转,代码如下: Matrix类的操作内容可参考: C# Drawing.Drawing2D.Matrix类,二维矩阵几何变换的3x3仿射矩阵类_wangnaisheng的博客-CSDN博客

    2024年02月11日
    浏览(31)
  • 【OpenCV实现图像:使用OpenCV进行图像处理之透视变换】

    透视变换(Perspective Transformation)是一种图像处理中常用的变换手段,它用于将图像从一个视角映射到另一个视角,常被称为投影映射。透视变换可以用于矫正图像中的透视畸变,使得图像中的物体在新的视平面上呈现更加规则的形状。 透视变换通常涉及到寻找图像中的特定

    2024年02月03日
    浏览(44)
  • 【OpenCV实现图像:使用OpenCV进行物体轮廓排序】

    在图像处理中,经常需要进行与物体轮廓相关的操作,比如计算目标轮廓的周长、面积等。为了获取目标轮廓的信息,通常使用OpenCV的findContours函数。然而,一旦获得轮廓信息后,可能会发现轮廓的顺序是无序的,如下图左侧所示: 在这个图中,每个轮廓都被找到,但它们的

    2024年02月03日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包