1.1.用途:平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)2.1.平移
说明:点(x,y)向x方向移动dx, y方向移动dy
变换后坐标:(x',y')=(x+dx,y+dy)
矩阵表示:   [x',y',1]=[1 0 dx][0 1 dy] [0 0 1]*[[x],[y],[1]]
2.2.缩放
说明:设点(x,y)在x轴方向扩大sx倍,y轴方向扩大sy倍
变换后坐标:(x',y')=(sx * x,sy * y)
矩阵表示:   [x',y',1]=[[sx 0 0] [0 sy 0][0 0 1]]  *[[x],[y],[1]]#缩放矩阵
2.3.旋转
说明:设点A(x1,y1)以原点(x0,y0)为圆心旋转θ度,求旋转后 A'(x',y')坐标值.
变换后坐标:y = rows-yx' = x0 + (x1 - x0) cosθ - (y1 - y0)sinθy' = y0 +(y1 - y0)cosθ + (x1 - x0) sinθy' = rows-y'变换后坐标(x',y'):x=rcos(b);y=rsin(b);x'=rcos(a+b)=rcosacosb−rsinasinb=xcosa−ysina;(合角公式)y'=rsin(a+b)=rsinacosb+rcosasinb=xsina+ycosa;旋转变换矩阵:[[cosa −sina][sina cosa]]#逆时针
2.4。翻转[x',y',1]=[ [1 0 0 ][0 -1 N+1][0 0 1] ]*[x,y,1]=============================================================================================
2.5.等距变换
R=[[r11 r12 dx]#平移变换和旋转变换的复合;等距变换前后长度,面积,线段之间的夹角都不变[r21 r22 dy]#左上角2×2矩阵为旋转部分,tx和ty为平移因子[0   0   1 ]#有三自由度,即旋转,x方向平移,y方向平移。
]=============================================================================================
2.6.切向变换
相当于一个横向截切与一个纵向剪切的复合常用于产生弹性物体的变形处理
[[ 1   shx 0][shy  1   0][ 0   0   1]
]
#https://www.cnblogs.com/liekkas0626/p/5238564.html
=============================================================================================
2.7.相似变换相似变换相当于是等距变换和均匀缩放的一个复合相似变换前后长度比,夹角,虚圆点I,J保持不变。相似变换其实与相似三角形之间是有类似的
S=[[s*r11 s*r12 dx]#左上角2×2矩阵为旋转部分,dx和dy为平移因子[s*r21 s*r22 dy]#有4个自由度,即旋转,x方向平移,y方向平移和缩放因子s[  0    0    1 ]
]=============================================================================================
2.8.仿射变换
性质:1)保持二维图形“平直性”和“平行性”,面积比保持不变;2)不具有保角性和保持距离比的性质不能保持垂直性角度会改变共线线段或者平行线段的长度比保持不变,矢量的线性组合不变3)有6自由度,即旋转4个,也就是前述大矩形的4个元素都可以同时改变,x方向平移,y方向平移。包括平移、旋转、缩放、倾斜(错切、剪切、偏移)、翻转变换
说明:   平直性:变换后直线还是直线、圆弧还是圆弧。平行性:平行线还是平行线,直线上点的位置顺序不变
计算:[u,v,1]=[[a1 b1  c1] [a2 b2 c2 ][0 0 1]]*[x,y,1]
3.投影变换(透视变换,射影变换)3.1.射影变换:是最一般的线性变换。有8个自由度。射影变换保持重合关系和交比不变。但不会保持平行性。即它会使得仿射变换产生非线性效应。3.2.射影变换仿射变换区别:射影变换变换矩阵[[a11 a12  a13] [a21 a22  a23 ][a31 a32  a33]]仿射变换变换矩阵[[a11 a12  a13] [a21 a22  a23 ][0 0 1]]在仿射的前提下,当左上角2×2矩阵正交时为欧式变换,左上角矩阵行列式为1时为定向欧式变换。所以射影变换包含仿射变换,而仿射变换包含欧式变换。[a11 a12 ] [a21 a22 ]表示线性变换如scaling(尺度),shearing(剪切)和ratotion(旋转)[a13 a23]表示平移参数,一个确定在x方向上的平移一个确定在y方向上的平移;[a31 a32]用于产生透视变换。从这里所以可以理解成仿射等是透视变换的特殊形式名词解释:projective transformation(投影变换) = homography(单应性变换) = collineation( 直射变换)=============================================================================================
4.备注最终变换矩阵2D基本模型视图变换只有上面这3种如某变换先经过平移(对应平移矩阵A)再旋转(对应旋转矩阵B)再缩放(对应缩放矩阵C)最终变换矩阵 T = ABC. #即3个矩阵按变换先后顺序依次相乘(矩阵乘法不满足交换律,讲究先后顺序)
5.实例:
旋转矩阵方法没有实现,有高手请补充# !/usr/bin/env python
# -*- coding: utf-8 -*-import numpy as np
import cv2,mathclass Pixel():def __int__(self):pass def __del__(self): passdef movePixelPoint(self,x,y,dx=0,dy=0)->list:b = [[1, 0, dx], [0, 1, dy], [0, 0, 1]]#平移矩阵X = [[x], [y], [1]]R=np.dot(b, X)           # X'=bXR=R.reshape(3)[0:2]return R.tolist()def zoomPixelPoint(self,x,y,sx=1,sy=1)->list:b = np.array([[sx, 0, 0], [0, sy, 0], [0, 0, 1]],dtype=np.float)#缩放矩阵X = np.array([[x], [y], [1]],dtype=np.float)R = np.dot(b, X)  # X'=bXR = np.uint8(R.round())R = R.reshape(3)[0:2]return R.tolist()def rotatePixelPoint(self,x,y,θ:int=0.0,center=(0.0,0.0),rows=480)->list:cosθ=math.cos(math.radians(θ))sinθ = math.sin(math.radians(θ))x1 = xy1 = rows - yx0 = center[0]y0 = rows - center[1]x = (x1-x0)*cosθ - (y1 - y0)*sinθ + x0y = (x1-x0)*sinθ + (y1 - y0)*cosθ + y0x=xy = rows - yreturn x,ydef rotatePixelPoint_(self,x,y,angle:int=0.0,center=(0.0,0.0))->list:scale=1x0, y0 = centercosθ = math.cos(math.radians(angle))sinθ = math.sin(math.radians(angle))α ,β= scale*cosθ,scale*sinθ# b = [[  α,β,(1- α)*x0 - β*y0],[ -β,α,β*x0+(1 - α)*y0],[0, 0, 1]]b =[[cosθ ,- sinθ,(1 - cosθ)*x0 + y0 * sinθ],[sinθ ,   cosθ,(1 - cosθ)*y0 - x0 * sinθ], [0 ,  0  , 1]]X = [[x], [y], [1]]R = np.dot(b, X)R = np.uint8(R.round())R = R.reshape(3)[0:2]R=R.tolist()return R#====================================================================================def __move__(self,src, pos: '(int,int)') -> np.ndarray:      # 彩色平移rows, cols = src.shape[:2]M = np.float32([[1, 0, pos[0]], [0, 1, pos[1]]])  # 平移转换矩阵: 右移动100;下移动50dst = cv2.warpAffine(src, M, (cols, rows))    # 图像的宽度和高度return dstdef __rotation_Scale__(self,src, angle:'float',rotation_center:'(float,float)'=None,scale:'float'=1)->np.ndarray:#彩色:旋转缩放rows, cols = src.shape[:2]cx=rotation_center[0] if rotation_center else cols/2.0cy=rotation_center[1] if rotation_center else rows/2.0# cols - 1 and rows - 1 are the coordinate limits.M = cv2.getRotationMatrix2D((cx, cy), angle, scale)dst = cv2.warpAffine(src, M, (int(2*cx), int(2*cy)))return dstdef __polylines__(self,img,pts:'ndarray.int32', isClosed:'bool', color:'tuple',thickness=1,lineType=8)->np.ndarray:tmp=thicknessif thickness<0:thickness=1cv2.__polylines__(img, pts, isClosed, color, thickness, lineType)# 绘图多边形(pts多边形各定点int32, Isclosed是否封闭)if tmp<0: cv2.fillPoly(img, pts, color)return  imgdef __getColorPicture__(self):img = np.zeros((480, 640, 3), dtype=np.uint8)pts = np.array([[100, 50], [200, 300], [70, 200], [50, 100]], np.int32)pts = pts.reshape((-1, 1, 2))img = self.__polylines__(img, [pts], True, (125, 255, 0), -1)cv2.putText(img, 'A', (100, 50-10), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 255), 1, 8)cv2.putText(img, 'B', (200, 300 + 10), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 255), 1, 8)cv2.putText(img, 'C', (70-20, 200+10), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 255), 1, 8)return imgdef __getColorPictureInCenter__(self):rgb=self.__getColorPicture__()img,rect,box=self.__getContours__(rgb)# 移动到中心cx_rect, cy_rect = int(round(rect[0][0], 0)), int(round(rect[0][1], 0))cv2.drawMarker(rgb, (cx_rect, cy_rect), (0, 0, 255))h, w = int(round(rgb.shape[0] / 2, 0)), int(round(rgb.shape[1] / 2, 0))dx, dy = w - cx_rect, h - cy_rectrgb_center = self.__move__(rgb, (dx, dy))return rgb_centerdef __getContours__(self,rgb):img=rgb.copy()gray = cv2.cvtColor(rgb, cv2.COLOR_BGR2GRAY)# 寻找二值图像轮廓ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)cnt = contours[1]cv2.drawContours(img, [cnt], 0, (125, 125, 125), 2)# 获取最小外接矩形rect = cv2.minAreaRect(cnt)box = cv2.boxPoints(rect)box = np.int0(box.round())cv2.drawContours(img, [box], 0, (0, 255, 255), 2)return img,rect,boxdef test_movePixelPoint(self,dx=50,dy=50):rgb=self.__getColorPictureInCenter__()img1,rect1,box1=self.__getContours__(rgb)img_ = self.__move__(rgb, (dx, dy))img2, rect2,box2 = self.__getContours__(img_)for i in range(4):x1,y1=box1[i]x2,y2=box2[i]x,y=self.movePixelPoint(x1,y1,dx,dy)x_,y_=x1+dx,y1+dyprint('[%s  %s %s %s ] [(x,y)=%s;(x1,y1)=%s;(x2,y2)=%s;]'%((x2-x1==dx),(y2-y1==dy),x2-x1-dx,y2-y1-dy,(x,y),(x1,y1),(x2,y2)))cv2.imshow('s1', img1)cv2.imshow('s2', img2)cv2.waitKey()def test_zoomPixelPoint(self,fx=0.5, fy=0.5):rgb = self.__getColorPictureInCenter__()img1, rect1, box1 = self.__getContours__(rgb)img_ = cv2.resize(rgb,None,fx=fx, fy=fy, interpolation = cv2.INTER_CUBIC)img2, rect2, box2 = self.__getContours__(img_)for i in range(4):x1, y1 = box1[i]x2, y2 = box2[i]x,y=self.zoomPixelPoint(x1, y1, sx=fx, sy=fy)print('[%s  %s %s %s ] [(x,y)=%s;(x1,y1)=%s;(x2,y2)=%s;]' % ((x2 - x == 0), (y2 - y == 0), x2 - x , y2 - y, (x, y), (x1, y1), (x2, y2)))cv2.imshow('s1', img1)cv2.imshow('s2', img2)cv2.waitKey()def test_rotatePixelPoint(self):rotateangle = -180center = (320, 240)rgb = self.__getColorPictureInCenter__()img1, rect1, box1 = self.__getContours__(rgb)img_ = self.__rotation_Scale__(rgb, angle=rotateangle,rotation_center=center,scale=1)img2, rect2, box2 = self.__getContours__(img_)for i in range(4):x1,y1=box1[i]x2, y2 = box2[i]x,y=self.rotatePixelPoint(x1, y1, rotateangle, center)print('[%s  %s %s %s ] [(x,y)=%s;(x1,y1)=%s;(x2,y2)=%s;]' % ((x2 - x == 0), (y2 - y == 0), x2 - x, y2 - y, (x, y), (x1, y1), (x2, y2)))cv2.imshow('s1', img1)cv2.imshow('s2', img2)cv2.waitKey()if  __name__ =='__main__':a=Pixel()# a.test_movePixelPoint(dx=150,dy=50)"""[True  True 0 0 ] [(x,y)=(481, 432);(x1,y1)=(331, 382);(x2,y2)=(481, 432);][True  True 0 0 ] [(x,y)=(380, 181);(x1,y1)=(230, 131);(x2,y2)=(380, 181);][True  True 0 0 ] [(x,y)=(460, 149);(x1,y1)=(310, 99);(x2,y2)=(460, 149);][True  True 0 0 ] [(x,y)=(561, 400);(x1,y1)=(411, 350);(x2,y2)=(561, 400);]"""# a.test_zoomPixelPoint()"""[False  True -1 0 ] [(x,y)=(166, 191);(x1,y1)=(331, 382);(x2,y2)=(165, 191);][True  False 0 -1 ] [(x,y)=(115, 66);(x1,y1)=(230, 131);(x2,y2)=(115, 65);][True  False 0 -1 ] [(x,y)=(155, 50);(x1,y1)=(310, 99);(x2,y2)=(155, 49);][False  False -1 -1 ] [(x,y)=(206, 175);(x1,y1)=(411, 350);(x2,y2)=(205, 174);]"""a.test_rotatePixelPoint()"""(x,y)=(309.0, 98.0)  (x1,y1)=(331, 382)     C   (x2,y2)=(330, 381)  A(x,y)=(410.0, 349.0) (x1,y1)=(230, 131) D   (x2,y2)=(229, 130) B(x,y)=(330.0, 381.0)  (x1,y1)=(310, 99)  A   (x2,y2)=(309, 98)  C(x,y)=(229.0, 130.0)  (x1,y1)=(411, 350) B   (x2,y2)=(410, 349) D(x,y)=(330.0, 381.0)  (x1,y1)=(310, 99)  A   (x2,y2)=(330, 381) A(x,y)=(229.0, 130.0)  (x1,y1)=(411, 350) B   (x2,y2)=(229, 130) B(x,y)=(309.0, 98.0)   (x1,y1)=(331, 382)     C   (x2,y2)=(309, 98)  C(x,y)=(410.0, 349.0)  (x1,y1)=(230, 131) D   (x2,y2)=(410, 349) D"""

2D图像像素点操作——平移,旋转,缩放 tcy相关推荐

  1. Unity 触屏手势控制Camera平移旋转缩放

    Unity 触屏手势控制Camera平移旋转缩放 实现思路 单点触屏,位移增量控制相机平移: 两点触屏,两点位移控制相机前后移动(缩放):两点中一点不位移控制相机绕点旋转: 实现需要的API Touc ...

  2. opencv之图像翻转、平移、缩放、旋转、仿射学习笔记

    opencv版本:opencv3.4.1 目录 1. 图像翻转(坐标映射) 2.  平移 3. 缩放 4. 旋转 1. 图像翻转(坐标映射) int main() {cv::Mat srcImage ...

  3. C# winform 通过Matrix实现图像的自由平移、缩放、旋转

    1.先上样图 软件在用户交互方面未做完善 ,后续会逐步完善. 代码已经同步到Github,欢迎下载使用,但是请注明出处. Github地址:https://github.com/zhouchen/zh ...

  4. 三维空间中的几何变换-平移旋转缩放

    前言 前段时间由于项目需要,深入学习了下图形几何变换,主要是绕任意轴旋转部分(其他的已有一定基础),现记录学习笔记. 文章内容部分引用并参考了下面的博客: http://netclass.csu.ed ...

  5. Unity矩阵平移旋转缩放Matrix4x4

    Unity中的矩阵(Matrix4x4) 最近在研究帧同步定点数物理系统中需要自定义定点数矩阵,所以在这里分享下基础的矩阵案例旋转.平移.缩放.(注意这里本文中的transform组件式基于unity ...

  6. WebGL编程指南-24 同时使用漫反射光和环境反射光、立方体平移旋转缩放变换时漫反射光和环境反射光处理

    1.demo效果 此效果是上一章绘制的立方体基础上,向Y轴方向平移一个单位,然后绕Z轴旋转30度. 如上图,归纳一下物体坐标变换法向量变化的规律如下 平移变换, 法向量不会改变 旋转变换, 大多数情况 ...

  7. flutter Transform 矩阵变换(平移旋转缩放)

    Transform其子Widget绘制时外面包着矩阵变换(transformation),通过它可以实现各种矩阵操作. 1.widget平移 效果图 2.旋转(rotate) 效果图: 3.缩放 Tr ...

  8. Python-OpenCV 处理图像(二)(三):滤镜和图像运算 图像像素点操作

    0x01. 滤镜 喜欢自拍的人肯定都知道滤镜了,下面代码尝试使用一些简单的滤镜,包括图片的平滑处理.灰度化.二值化等: import cv2.cv as cvimage=cv.LoadImage('i ...

  9. 三维坐标 偏转_三维坐标变换原理-平移, 旋转, 缩放

    给定一个二维点(x, y),那么形如(kx, ky, k)的所有三元组就都是等价的,它们就是这个点的齐次坐标(homogeneous).齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示,是指 ...

  10. 三维坐标要建一个4*4的矩阵?平移 旋转 缩放

    移植不知道三维物体的旋转平移缩放和矩阵的关系.找到这篇文章借鉴一下. 转自:https://blog.csdn.net/ALLENJIAO/article/details/80348362 怎么平移一 ...

最新文章

  1. LINQ学习之旅——准备(2)
  2. mapreduce编程规范_大数据之MapReduce详解
  3. 牛客网(剑指offer) 第十二题 数值的整数次方
  4. Asp.Net Core EndPoint 终结点路由工作原理解读
  5. [Spring5]IOC容器_Bean管理XML方式_创建对象_set注入属性and有参构造注入属性
  6. python语言程序设计试卷西京学院_Python语言程序设计A-中国大学mooc-试题题目及答案...
  7. Docker垃圾清理方案
  8. 【TSP】基于matlab遗传算法求解30城市旅行商问题【含Matlab源码 135期】
  9. 单词学习-Unit8Text3-1(15年7月29日,第8天)
  10. csr驱动程序linux版,CSR8510蓝牙驱动下载
  11. 小米怎么快速回到顶部_实在没想到,小米有6种截屏方法!以前只知道3种,实在太吃亏了...
  12. 360卸载软件测试初学者,360软件管家如何卸载软件?360软件管家卸载软件的方法步骤...
  13. verilog 7段数码管译码器
  14. 去毛刺服务行业调研报告 - 市场现状分析与发展前景预测
  15. 计算机发展史资料简介,计算机发展史简介
  16. iOS 切换到后台任务执行
  17. 读《富兰克林传 绪》有感
  18. Spark bucketing bucket分桶原理和应用
  19. python安装arcpy_为arcpy安装pip
  20. 解读相机镜头中的那些名词 — 焦距、焦段、光圈、景深

热门文章

  1. 【游记】CSP2021-试手记
  2. 永不消逝的电波(三):低功耗蓝牙(BLE)入门之如何调戏别人的小米手环
  3. MySQL 8 复制(一)——异步复制
  4. 酷狗、QQ音乐歌词转换工具
  5. ASP.NET常用服务器控件
  6. Pandas学习 - 索引
  7. 为个人博客添加文章评论功能
  8. 【翻译】混沌网+SkyWalking:为混沌工程提供更好的可观察性
  9. 全新原装 SD3337C SOP8 丝印HXN 升压DC/DC转换器恒流白光LED驱动
  10. 【Python计量】参数假设检验