图片的几何变换
图片的几何变换章节介绍
图片位移 & 图片缩放
图片剪切 & 图片镜像
图片仿射变换
Hog + Svm 小狮子识别
计算机视觉的基础: 裁剪样本为 64,128 等比例缩放
mark
仿射变换: 位移, 旋转, 缩放
mark
算法完成. 梯形到正方向的投影.
复杂案例的基础.
图片缩放
mark
缩放, 会从原理, api, 源码. 三个角度阐述.
缩放就是改变图片的宽高.
根据变化大小, 会有放大和缩小两种.
根据当前宽高比是否变化, 有等比例缩放和非等比例
mark
还介绍了图片的最近邻域差值和双线插值
图片剪切
思路就是拿到图片数据集中的一部分数据将数据进行剪切
mark
本质还是对于矩阵的操作
图片位移
mark
利用矩阵完成图片的映射变化
当前图片向右移动一百个像素. 原图片的 x,y 值产生新的 x,y
图片镜像
实现步骤:
创建一个更大的画板
将一幅图像分别从前往后, 从后往前绘制
绘制中心分割线
mark
矩阵倒序矩阵.
仿射变换: 位移 旋转 缩放
mark
旋转, 移位, 缩放.
基本都是对图片仿射变换矩阵的操作.
本质是对图片数据的矩阵操作
图片缩放 1
缩放: 改变图片的宽度与高度
可以放大也可以缩小
opencv 中的 api resize
改变图片尺寸的步骤:
加载图片
获取图片信息
调用 resize
检查最终结果
- import cv2
- img = cv2.imread('image0.jpg',1)
- imgInfo = img.shape
- print(imgInfo)
- # 图片的高度, 宽度, 颜色组成方式 3 指一个像素点由三个颜色通道组成
- height = imgInfo[0]
- width = imgInfo[1]
- mode = imgInfo[2]
- # 1 放大 缩小
- # 2 等比例 非 原来图片 2:3 更改之后还是 2:3
- dstHeight = int(height*0.5)
- dstWidth = int(width*0.5)
- # 原始图片的宽高乘以一个共同的系数, 等比例缩放.
- # 原始图片的宽高乘以一个不同的系数, 非等比例缩放.
- # opencv 提供了四种方式: 最近邻域插值 双线性插值 像素关系重采样 立方插值
- # 默认使用第二种: 双线性插值
- # 第一个参数: 我们要缩放的图片 第二个参数: 要缩放成的目标图片大小
- dst = cv2.resize(img,(dstWidth,dstHeight))
cv2.imshow('image',dst)
cv2.waitKey(0)
讲解最近邻域差值法和双线性插值算法原理
python 源代码实现
最近临域插值 双线性插值 原理
原始 src 10*20 目标 dst 5*10
目标图像上的每个点都是来自原图像的.
dst<<<src
目标图像的(1,2) 对应 原图像的(2,4)
已知目标图片 dst 的 x 值 1 对应 原始图片 src x 值 2 newX
newX = x*(src 行 / 目标 行)[即缩放比例] newX = 1*(10/5) = 2
newY = y*(src 列 / 目标 列)[即缩放比例] newY = 2*(20/10)= 4
12.3 = 12
对于一个非整数的像素坐标, 我们取最近的点, 就叫最近邻域差值法
双线性插值
mark
四个角分别表示当前像素点的坐标. 目标 dst 的大小(5,10)
使用目标插值法得到的原图像点未 (15.2,22.3) 实际上我们的原图像上是不存在这个点的, 如何用周围的四个点表示这个点.
最近邻域插值是取最近的点, 而双线性是通过穿过的四个点来合成该点.
mark
水平方向上穿过 A1A2, 竖直方向上穿过 B1B2
计算出 A1,A2,B1,B2. 通过这四个点进行合成.
x 轴表明的是我们图片的列, y 轴表明的是我们图片的行
A1 的横坐标 15.2, 表明它距离上面点 20%, 距离下面点 80%
A1 = 20% 上 + 80% 下 A2
B1 = 30% 左 + 70% 右 B2
方法 1 最终点 = A1 30% A2 70%
方法 2 最终点 = B1 20% B2 80%
实质: 矩阵运算
图片缩放最近领域插值和双线性代码
获取图片 info(高, 宽, 颜色组成方式)
新建空白模版
重新计算 xy 坐标
- import cv2
- import numpy as np
- # 图片名称, 彩色图片
- img = cv2.imread('image0.jpg',1)
- imgInfo = img.shape
- height = imgInfo[0]
- width = imgInfo[1]
- # 目标图片高度宽度
- dstHeight = int(height/2)
- dstWidth = int(width/2)
- # 创建一个空白模板. 第一个参数(高, 宽, 颜色组成) 第二个参数 数据类型: uint8 是 0-255
- dstImage = np.zeros((dstHeight,dstWidth,3),np.uint8) # 0-255
- # 计算目标图片坐标
- for i in range(0,dstHeight): # 行
- for j in range(0,dstWidth): # 列
- # 乘 1.0 转换为浮点型
- iNew = int(i*(height*1.0/dstHeight))
- jNew = int(j*(width*1.0/dstWidth))
- dstImage[i,j] = img[iNew,jNew]
cv2.imshow('dst',dstImage)
cv2.waitKey(0)
# 三个角度: 1. opencv API resize 2. 算法原理 3. 源码
图片剪切
mark
要想完成图片的剪切, 我们得先搞清图片的坐标系.
x 轴描述的是宽度信息列信息, y 轴描述的是宽度信息行信息.
蓝绿色的蒙板就是我们想要剪切的内容
x,y 位置信息.
从 x 轴 100 -> 200
从 y 轴 100 -> 300
- import cv2
- img = cv2.imread('image0.jpg',1)
- imgInfo = img.shape
- # 利用切片实现剪切
- dst = img[100:200,100:300]
cv2.imshow('image',dst)
cv2.waitKey(0)
mark
来源: http://www.jianshu.com/p/6fb426fac3e1