内容简介:几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动。几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定为整数坐标。这时就需要灰度级差值将映射的新坐标匹配到输出像素之间。最简单的插值方法是最近邻插值,就是令输出像素的灰度值等于映射最近的位置像素,该方法可能会产生锯齿。这种方法也叫零阶插值,相应比较复杂的还有一阶和高阶插值。插值算法感觉只要了解就可以了,图像处理中比较需要理解的还是空间变换。
几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动。
几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定为整数坐标。这时就需要灰度级差值将映射的新坐标匹配到输出像素之间。最简单的插值方法是最近邻插值,就是令输出像素的灰度值等于映射最近的位置像素,该方法可能会产生锯齿。这种方法也叫零阶插值,相应比较复杂的还有一阶和高阶插值。
插值算法感觉只要了解就可以了,图像处理中比较需要理解的还是空间变换。
总结一下最近看的关于OpenCV图像几何变换的一些笔记。
这是原图:
原图
1、平移
import cv2 import numpy as np img = cv2.imread("linuxidc.com.jpg", 1) imgInfo = img.shape height = imgInfo[0] width = imgInfo[1] mode = imgInfo[2] dst = np.zeros(imgInfo, np.uint8) for i in range( height ): for j in range( width - 100 ): dst[i, j + 100] = img[i, j] cv2.imshow('linuxidc.com', dst) cv2.waitKey(0)
示例很简单,就是将图像向右平移了100个像素,如图:
2、镜像
import cv2 import numpy as np img = cv2.imread('linuxidc.com.jpg', 1) cv2.imshow('src', img) imgInfo = img.shape height= imgInfo[0] width = imgInfo[1] deep = imgInfo[2] dst = np.zeros([height*2, width, deep], np.uint8) for i in range( height ): for j in range( width ): dst[i,j] = img[i,j] dst[height*2-i-1,j] = img[i,j] for i in range(width): dst[height, i] = (0, 0, 255) cv2.imshow('www.linuxidc.com', dst) cv2.waitKey(0)
生成一个如下效果图:
3、缩放
import cv2 img = cv2.imread("linuxidc.com.jpg", 1) imgInfo = img.shape print( imgInfo ) height = imgInfo[0] width = imgInfo[1] mode = imgInfo[2] # 1 放大 缩小 2 等比例 非等比例 dstHeight = int(height * 0.5) dstWeight = int(width * 0.5) # 最近邻域插值 双线性插值 像素关系重采样 立方插值 dst = cv2.resize(img, (dstWeight,dstHeight)) print(dst.shape) cv2.imshow('www.linuxidc.com', dst) cv2.waitKey(0)
使用resize直接进行缩放操作,同时还可以使用邻域插值法进行缩放,代码如下:
# 1 info 2 空白模板 3 重新计算x, y import cv2 import numpy as np img = cv2.imread('linuxidc.com.jpg', 1) imgInfo = img.shape # 先高度,后宽度 height = imgInfo[0] width = imgInfo[1] dstHeight = int(height/2) dstWidth = int(width/2) dstImage = np.zeros([dstHeight, dstWidth, 3], np.uint8) for i in range( dstHeight ): for j in range(dstWidth): iNew = i * ( height * 1.0 / dstHeight ) jNew = j * ( width * 1.0 / dstWidth ) dstImage[i,j] = img[int(iNew),int(jNew)] cv2.imshow('linuxidc.com', dstImage) cv2.waitKey(0)
示例效果图如下:
4、旋转
import cv2 img = cv2.imread('linuxidc.com.jpg', 1) cv2.imshow('src', img) imgInfo = img.shape height= imgInfo[0] width = imgInfo[1] deep = imgInfo[2] # 定义一个旋转矩阵 matRotate = cv2.getRotationMatrix2D((height*0.5, width*0.5), 45, 0.7) # mat rotate 1 center 2 angle 3 缩放系数 dst = cv2.warpAffine(img, matRotate, (height, width)) cv2.imshow('www.linuxidc.com',dst) cv2.waitKey(0)
旋转需要先定义一个旋转矩阵,cv2.getRotationMatrix2D(),参数1:需要旋转的中心点.参数2:需要旋转的角度.参数三:需要缩放的比例。效果如下图:
5、仿射
import cv2 import numpy as np img = cv2.imread('linuxidc.com.jpg', 1) cv2.imshow('src', img) imgInfo = img.shape height= imgInfo[0] width = imgInfo[1] deep = imgInfo[2] # src 3 -> dst 3 (左上角, 左下角,右上角) matSrc = np.float32([[0,0],[0,height-1],[width-1, 0]]) # 需要注意的是 行列 和 坐标 是不一致的 matDst = np.float32([[50,50],[100, height-50],[width-200,100]]) matAffine = cv2.getAffineTransform(matSrc,matDst) #mat 1 src 2 dst 形成组合矩阵 dst = cv2.warpAffine(img, matAffine,(height, width)) cv2.imshow('www.linuxidc.com',dst) cv2.waitKey(0)
需要确定图像矩阵的三个点坐标,及(左上角, 左下角,右上角).定义两个矩阵,matSrc 为原图的三个点坐标,matDst为进行仿射的三个点坐标,通过cv2.getAffineTransform()形成组合矩阵.效果如下:
更多 Python 相关信息见 Python 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=17
Linux公社的RSS地址 : https://www.linuxidc.com/rssFeed.aspx
本文永久更新链接地址: https://www.linuxidc.com/Linux/2019-05/158625.htm
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Opencv图像处理系列(二)——几何变换
- 深度学习和几何(演讲提要)
- 基于数据驱动的三维几何解码器
- AI“画皮”,色情原罪之后,商业机遇几何?
- 哭了!好美!交互式《几何原本》再现江湖
- 红帽变“蓝”,IBM 豪赌云服务胜算几何?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Designing Data-Intensive Applications
Martin Kleppmann / O'Reilly Media / 2017-4-2 / USD 44.99
Data is at the center of many challenges in system design today. Difficult issues need to be figured out, such as scalability, consistency, reliability, efficiency, and maintainability. In addition, w......一起来看看 《Designing Data-Intensive Applications》 这本书的介绍吧!