首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何旋转坐标,考虑到当使用WarpAffine旋转时,OpenCV会在图像中添加黑色边框?

旋转坐标是指将一个坐标点绕着某个中心点按照一定角度进行旋转变换。在使用WarpAffine函数进行图像旋转时,OpenCV默认会在旋转后的图像中添加黑色边框,这是因为旋转后的图像会发生形变,为了保持图像完整性,OpenCV会自动填充黑色边框。

要解决这个问题,可以采取以下步骤:

  1. 确定旋转中心点:首先需要确定旋转的中心点,可以通过计算图像的中心点坐标来作为旋转中心。
  2. 计算旋转矩阵:使用cv2.getRotationMatrix2D函数来计算旋转矩阵,该函数接受旋转中心点坐标、旋转角度和缩放因子作为参数。
  3. 执行旋转变换:使用cv2.warpAffine函数来执行旋转变换,该函数接受待旋转的图像、旋转矩阵和输出图像的大小作为参数。
  4. 剪裁图像:根据旋转后的图像大小,可以对图像进行剪裁,去除黑色边框部分。

下面是一个示例代码:

代码语言:txt
复制
import cv2

def rotate_image(image, angle):
    # 获取图像中心点坐标
    height, width = image.shape[:2]
    center = (width / 2, height / 2)

    # 计算旋转矩阵
    rotation_matrix = cv2.getRotationMatrix2D(center, angle, 1.0)

    # 执行旋转变换
    rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height))

    # 剪裁图像
    cos = np.abs(rotation_matrix[0, 0])
    sin = np.abs(rotation_matrix[0, 1])
    new_width = int((height * sin) + (width * cos))
    new_height = int((height * cos) + (width * sin))
    rotation_matrix[0, 2] += (new_width / 2) - center[0]
    rotation_matrix[1, 2] += (new_height / 2) - center[1]
    rotated_image = cv2.warpAffine(rotated_image, rotation_matrix, (new_width, new_height))

    return rotated_image

# 加载图像
image = cv2.imread('image.jpg')

# 旋转图像
rotated_image = rotate_image(image, 45)

# 显示旋转后的图像
cv2.imshow('Rotated Image', rotated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,我们定义了一个rotate_image函数来实现图像的旋转。首先计算图像的中心点坐标,然后使用cv2.getRotationMatrix2D函数计算旋转矩阵,接着使用cv2.warpAffine函数执行旋转变换。最后根据旋转后的图像大小,对图像进行剪裁,去除黑色边框部分。

对于旋转角度为45度的示例,可以根据实际需求进行调整。此外,还可以根据具体应用场景选择合适的腾讯云产品进行图像处理,例如腾讯云的图像处理服务、云服务器等。具体产品介绍和链接地址可以参考腾讯云官方网站。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

经验 | OpenCV图像旋转的原理与技巧

所以决定从程序员可以接受的角度从新介绍一下图像旋转基本原理与OpenCV图像旋转函数操作的基本技巧。...图像旋转基本原理 旋转涉及到两个问题,一个是图像旋转之后的大小会发生改变,会产生背景,通过背景填充方式都是填充黑色,此外旋转还是产生像素的位置迁移,新的位置像素需要通过插值计算获得,常见的插值方式有最近邻...首先看旋转之后的图像宽高变化,如下图所示: ? ? 这个是正常的平面坐标旋转矩阵,可以简写为: ?...是一个2x3的矩阵,但是在图像左上角是原点,要实现围绕图像的中心位置旋转,M就要重新计算,所以OpenCV图像旋转矩阵为: ? 其中scale是表示矩阵支持旋转+放缩,这里可以把Scale=1。...) 但是M如何生成与获取,OpenCV中提供了一个函数根据输入的参数自动生成旋转矩阵M,该函数为: Mat cv::getRotationMatrix2D( Point2f center

2.9K40
  • Task02 几何变换

    Image 因此,对于旋转和偏移,就需要3步(3次变换): 将输入原图图像坐标转换为笛卡尔坐标系; 进行旋转计算。旋转矩阵前面已经给出了; 将旋转后的图像的笛卡尔坐标转回图像坐标。...图像坐标系与笛卡尔坐标系转换关系: 先看下图: ? Image 在图像我们的坐标系通常是AB和AC方向的,原点为A,而笛卡尔直角坐标系是DE和DF方向的,原点为D。...令图像表示为M×N的矩阵,对于点A而言,两坐标坐标分别是(0,0)和(-N/2,M/2),则图像某像素点(x',y')转换为笛卡尔坐标(x,y)转换关系为,x为列,y为行: ?...Image 反向映射 看第3个问题,在冈萨雷斯的《数字图像处理_第三版》说的很清楚,前向映射就是根据原图用变换公式直接算出输出图像相应像素的空间位置,那么这会导致一个问题:可能会有多个像素坐标映射到输出图像的同一位置...,也可能输出图像的某些位置完全没有相应的输入图像像素与它匹配,也就是没有被映射到,造成有规律的空洞(黑色的蜂窝状)。

    73440

    常用数据增广方法,解决数据单一问题

    但是在实际应用,向前映射会出现如下几个问题: 浮点数坐标,如(1,1)映射为(0.5,0.5),显然这是一个无效的坐标,这时我们需要使用插值算法进行进一步处理。...可以从上图知道:原图经过前向映射旋转了30度后,输出图像中有规律的空洞(黑色的蜂窝状),那这些空洞是这么来的呢? ?...在使用过程,如果在一些不改变图像大小的几何变换,向前映射还是十分有效的,向后映射主要运用在图像旋转的缩放,因为这些几何变换都会改变图像的大小。 几何变换 先看第一个问题,变换的形式。...仿射变换相关的函数一般涉及到warpAffine和getRotationMatrix2D这两个: 使用OpenCV函数warpAffine 来实现一些简单的重映射....可以看到,图像的一部分被截断了,其原因是: 1. 旋转过后的图像大小应该发生变化才能装下旋转后的图片; 2. OpenCv坐标转成笛卡尔坐标系后没转回图像坐标系。

    2.1K10

    水平投影法检测&分割多行文本图像

    而膨胀就是把图像的颜色区域进行一定程度的“扩大”,使其内部的小空洞被填充掉,用在文字上则可以在一定程度上使一个个文字变成一个个整块的字团。还有开运算和闭运算其实就是把腐蚀和膨胀结合起来使用。...当然以上所说的效果都是理想的情况,真正使用起来其实效果并没有那么完美,而且要根据情况对变换使用的“核”进行调整,来找到最合适的尺寸。...记录下每条线穿过图像遇到的黑色的像素点(文本部分才为黑色)数量,得到一个值,作为该条线所在y坐标下的值,就会得到一个曲线图,这个图上每个点的长度表示该y坐标上,黑色像素点的数量。...,使用坐标来计算包含所有这些坐标旋转边框 coords = np.column_stack(np.where(thresh > 0)) angle = cv2.minAreaRect(...,使用坐标来计算包含所有这些坐标旋转边框 coords = np.column_stack(np.where(thresh > 0)) angle = cv2.minAreaRect(

    2K10

    图像变换基础:齐次坐标

    OpenCV 的函数warpAffine()实现了图像按照平移矩阵的仿射变换,其函数形式是warpAffine(src, M, dsize),主要参数的含义为: src:需要变换的图像对象,即上述程序的...程序(rows,cols)使用了输入图像的大小。 2. 缩放 仿照实现平移变换的程序,构造缩放矩阵,依然使用warpAffine()函数实现变换。...旋转 虽然可以按照旋转变换的矩阵形式,比如旋转角度 ,构建旋转矩阵,再使用warpAffine()函数实现变换,但是,这样做的结果往往不如人意。...: 从输出结果可以看出,上述旋转是以原始图像坐标原点(注意:计算机图形坐标原点在左上角)为旋转中心,旋转了 。...为了避免此种情况,可以使用 OpenCV 的专有函数构造旋转变换矩阵,如以下程序所示。

    2.5K40

    空间变换是什么_信号与系统状态转移矩阵

    src对应列表 dst:目标图像相应三角形顶点的坐标,也就是三个点在变换后图像坐标列表,要求与源图像三个点一一对应 retval返回值:从三对对应的点计算出来的仿射变换矩阵 2、warpAffine...函数 在OpenCV,仿射变换可以通过函数warpAffine来支持,当然部分单独的函数也可以进行某个特定的变换,如缩放和旋转就有单独的变换函数。...另外borderMode取值为cv2.BORDER_TRANSPARENT,目标图像与源图像的离群值相对应的像素不被函数修改(关于离群值老猿暂还未完全弄明白,暂且存疑) 返回值:为仿射变换后的结果图像矩阵...按照OpenCV官方介绍,getRotationMatrix2D得到的矩阵为: 绕指定点旋转进行组合变换,参考点p(m,n)顺时针旋转θ的组合变换的齐次坐标表示公式为: 上述公式θ为正表示是顺时针旋转...而缩放的齐次坐标表示公式为: 用缩放矩阵左乘平移矩阵则可以得到顺时针旋转同时进行缩放的齐次坐标表示公式: 等比例缩放且缩放因子等于s,上述公式的kx、ky使用s替换。

    96630

    Python+OpenCV实现旋转文本校正

    参考链接: python opencv 基础5 : putText() 为图像增加文本 假设我们有一幅图像图像的文本被旋转了一个未知的角度。...为了对文字进行角度的校正,我们需要完成如下几个步骤:  1、检测出图中的文本范围  2、计算出文本被旋转的角度  3、将图像旋转特定的角度  第一步、读取图像,并做二值化处理 #读取图像,做二值化处理...#计算包含了旋转文本的最小边框 coords = np.column_stack(np.where(thresh > 0)) print(coords) #该函数给出包含着整个文字区域矩形边框,这个边框旋转角度和图中文本的旋转角度一致...angle = cv.minAreaRect(coords)[-1] print(angle)  我们将这些坐标传给函数cv.minAreaRect,该函数将给出包含着整个文字区域的矩形边框,这个边框旋转角度和图中文本的旋转角度一致...[:2] center = (w//2, h//2) print(angle) M = cv.getRotationMatrix2D(center, angle, 1.0) rotated = cv.warpAffine

    1.3K00

    【从零学习OpenCV 4】图像仿射变换

    介绍完图像的缩放和翻转后,接下来将要介绍图像旋转,但是在OpenCV 4并没有专门用于图像旋转的函数,而是通过图像的仿射变换实现图像旋转。...针对这个流程,OpenCV 4提供了getRotationMatrix2D()函数用于计算旋转矩阵和warpAffine()函数用于实现图像的仿射变换。...(3.12) 确定旋转矩阵后,通过warpAffine()函数进行仿射变换,就可以实现图像旋转,在代码清单3-32给出了warpAffine()函数的函数原型。...(3.14) 仿射变换又称为三点变换,如果知道变换前后两张图像中三个像素点坐标的对应关系,就可以求得仿射变换的变换矩阵,OpenCV 4提供了利用三个对应像素点来确定矩阵的函数getAffineTransform...const Point2f dst[] 3. ) src[]:原图像的三个像素坐标。 dst[]:目标图像的三个像素坐标

    92340

    opencv图像的几何变换

    图像缩小时候,该方法可以避免波纹出现。...图像放大,类似于 CV_INTER_NN 方  cv2.INTER_CUBIC  # 立方插值 cv2.INTER_LINEAR # 双线形插值  cv2.INTER_NN # 最近邻插值...仿射变换cv2.warpAffine() 非关键字参数有src, M, dsize,分别表示源图像,变换矩阵,变换后的图像的长宽 这里说一下放射变换的变换矩阵 位移变换矩阵为: 旋转变换矩阵:...标准旋转变换矩阵为 但该矩阵没有考虑旋转变换进行位移以及缩放操作,OpenCV旋转变换如下:  其中 OpenCV中提供了一个函数获得这样一个矩阵 M=cv2.getRotationMatrix2D...(pts1, pts2) pts1,pts2分别为变换前点的位置以及变换后点的位置 (其实所有的变换的变换矩阵都可以通过变换前后点的坐标得到,即通过上面这个函数,因为所有的变换都是透视变换的特例而已)

    40720

    番外篇: 仿射变换与透视变换

    仿射变换 基本的图像变换就是二维坐标的变换:从一种二维坐标(x,y)到另一种二维坐标(u,v)的线性变换: image.png 如果写成矩阵的形式,就是: image.png 作如下定义: image.png...来看下OpenCV如何实现仿射变换: import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('...在OpenCV旋转就是用相似变换实现的: 若缩放比例为scale,旋转角度为θ,旋转中心是 \(center\_x,center\_y\) ,则仿射变换可以表示为: image.png 其中, image.png...经验之谈:OpenCV默认按照逆时针旋转噢~ 总结一下(原图[#计算机视觉:算法与应用p39]): 变换 矩阵 自由度 保持性质 平移 [I, t](2×3) 2 方向/长度/夹角/平行性/直线性 刚体...OpenCV首先根据变换前后的四个点用cv2.getPerspectiveTransform()生成3×3的变换矩阵,然后再用cv2.warpPerspective()进行透视变换。

    2K10

    图像旋转:getRotationMatrix2D详解--无损失旋转图片

    使用opencv图像进行旋转的代码随手一搜即得,但是有些旋转图像会不完整,有些只给出代码并未解释其实现原理。本文会详细介绍如何使用opencv实现图像旋转得到完整图像,以及其中的实现原理。...输入中心点坐标(centerX,centerY),旋转角度\theta,缩放比例,给出M变换矩阵 \begin{bmatrix} cos\theta & -sin\theta & (1-cos\theta...2. warpAffine操作 2.1 获取M矩阵 得到变换矩阵M,对图像每个点进行M变换就可以得到旋转后的图像,这一步可以通过opencvwarpAffine得到。...但是通过以上操作,旋转后大图像会丢失信息,如下图所示: [200] 2.2 扩大画布 画布大小不变的情况下,会有一部分图像超出,显示不全,所以我们需要将画布扩大为: 新的高由图片中两段蓝色线组合 new...最后附上使用opencv进行图像旋转并且不丢失信息到完整代码: def opencv_rotate(img, angle): h, w = img.shape[:2] center =

    23.4K122

    OpenCV 3.1.0图像放缩与旋转

    OpenCV在3.1.0版本图像放缩与旋转操作比起之前版本更加的简洁方便,同时还提供多种插值方法可供选择。...图像放大时候最常用的插值方法是双线性与立方插值方式,图像缩小时候OpenCV推荐使用的是面积采样方法。 API演示 -放大代码演示 ? -缩小代码演示 ?...矩阵中最后一列表示原点坐标是(0, 0)但是对于实际图像来说使用的屏幕坐标其原点(0, 0)在左上角位置,而其真实的原点位置为(width/2, height/2)才是矩阵描述原点(0, 0)位置。...OpenCV3.1.0实现图像旋转需要用到的两个API函数分别是 - getRotationMatrix2D - warpAffine 第一个函数是用来产生旋转矩阵M,第二个函数是根据旋转矩阵M实现图像指定角度的旋转...从上面旋转以后图像可以看到四个角被剪切掉了,无法显示,我们希望旋转之后图像还能够全部显示,在之前2.x的OpenCV版本要实现这样的功能,需要很多的数学知识,而在3.1.0只需要添加如下几行代码即可实现旋转之后的全图显示

    2.3K70

    图像的几何变换——平移、镜像、缩放、旋转、仿射变换 OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)数字图像处理笔

    但是,在使用向前映射处理几何变换却有一些不足,通常会产生两个问题:映射不完全,映射重叠 映射不完全 输入图像的像素总数小于输出图像,这样输出图像的一些像素找不到在原图像的映射。 ?...要解决上述两个问题可以使用“向后映射”,使用输出图像坐标反过来推算改坐标对应于原图像坐标位置。...图像缩小时,图像会变得更加清晰,图像放大图像的质量会有所下降,因此需要进行插值处理。...需要注意的是,在OpenCV使用仿射变换函数,通常会先计算一个仿射变换矩阵,以此来获得仿射变换矩阵,为了实现这个功能,常常使用getRotationMatrix2D()函数用来计算二维旋转矩阵,这个变换会将旋转中心映射到它自身...;第二个参数是double 类型的angle,也就是我们说的旋转角度,值得一提的是,angle的值为正时,表示的是逆时针旋转angle的值为负,表示的是顺时针旋转

    10.2K31

    Python下opencv使用笔记(三)(图像的几何变换)

    那么怎么移动,怎么让上一刻的画面移动到这一刻,这都是根据了你的移动量,然后找到三维坐标之间的对应关系,用这一刻的坐标替换到上一刻的坐标像素值实现图像的切换。...通过坐标轴可以看到图像扩大了一倍,并且两种方法相同。...(三)图像旋转 图像旋转矩阵一般为:  M=[cos(θ)sin(θ)−sin(θ)cos(θ)] 但是单纯的这个矩阵是在原点处进行变换的,为了能够在任意位置进行旋转变换,opencv采用了另一种方式...(四)图像的仿射 图像旋转加上拉升就是图像仿射变换,仿射变化也是需要一个M矩阵就可以,但是由于仿射变换比较复杂,一般直接找很难找到这个矩阵,OpenCV提供了根据变换前后三个点的对应关系来自动求解M。...然后在使用函数cv2.warpAffine()。形象化的图如下(引用参考的)  ?

    1.5K10

    计算机视觉:6.2~6.5 图像的基本变换与仿射变换

    matrix(n,n,n,n,n,n)值就使用了仿射变换来操作图像旋转、缩放、平移。...仿射变换是图像旋转,缩放,平移的总称。具体的做法是通过一个矩阵和原图片坐标进行计算,得到新的坐标,完成变换,其关键在于变换矩阵。...warpAffine(src, M, dsize, flags, mode, value) M:变换矩阵; dsize:输出图片大小; flag:类似于resize的插值算法; mode:边界外推法标志...getRotationMatrix2D(center, angle, scale) center:中心点,以图片的哪个点作为旋转的中心点; angle:角度,旋转的角度,按照逆时针旋转; scale...:缩放比例,对图片进行缩放; # 除了平移,仿射矩阵还可以完成图像旋转 # 旋转同样需要进行矩阵计算,为了方便计算旋转矩阵 # 使用getRotationMatrix2D方法可以获得想要的旋转矩阵 import

    77010

    10、图像的几何变换——平移、镜像、缩放、旋转、仿射变换 OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)数字图像

    但是,在使用向前映射处理几何变换却有一些不足,通常会产生两个问题:映射不完全,映射重叠 映射不完全 输入图像的像素总数小于输出图像,这样输出图像的一些像素找不到在原图像的映射。 ?...要解决上述两个问题可以使用“向后映射”,使用输出图像坐标反过来推算改坐标对应于原图像坐标位置。...图像缩小时,图像会变得更加清晰,图像放大图像的质量会有所下降,因此需要进行插值处理。...需要注意的是,在OpenCV使用仿射变换函数,通常会先计算一个仿射变换矩阵,以此来获得仿射变换矩阵,为了实现这个功能,常常使用getRotationMatrix2D()函数用来计算二维旋转矩阵,这个变换会将旋转中心映射到它自身...;第二个参数是double 类型的angle,也就是我们说的旋转角度,值得一提的是,angle的值为正时,表示的是逆时针旋转angle的值为负,表示的是顺时针旋转

    3.5K51

    python opencv numpy旋转图片

    参考链接: Python的numpy.rot90 python旋转图片  背景  在图像处理,有的时候会有对图片进行角度旋转的处理,尤其是在计算机视觉对于图像扩充,旋转角度扩充图片是一种常见的处理...常见的旋转处理有两种方式,一种是转化为numpy矩阵后,对numpy矩阵进行处理,另外一种是使用opencv自带的函数进行各种变换处理,以实现旋转角度的结果。 ...原始图像:  opencv函数  旋转中常用的函数有以下几个函数  cv2.transpose: 对图像矩阵进行转置处理  img = cv2.imread(origin_img_path) img_transpose...2),45,0.6) cv2.warpAffine: 对图像进行仿射变换,一般进行平移或者旋转操作  img = cv2.imread(origin_img_path) cv2.warpAffine(img...旋转90度  逆时针    使用opencv函数的转置操作+翻转操作实现旋转使用numpy.rot90实现   def rotateAntiClockWise90(img_file):  # 逆时针旋转

    3.9K30
    领券