机器学习基础篇(3)之图像运算和变换

目录

1.图像运算

1.1 图像的加法运算

1.2 图像的减法运算

1.3图像融合

2.OpenCV的位运算

2.1 非操作

2.2 与运算

2.3 或和异或

3. 图像的基本变换

3.1 图像的放大与缩小

3.2 图像的翻转

 3.3 图像的旋转

3.4.仿射变换之图像平移仿射

3.5 仿射变换之获取变换矩阵

3.6.透视变换

 3.6.1.三个点确定变换矩阵       

  3.6.2.四个点确定变换矩阵   


1.图像运算

1.1 图像的加法运算

  • add opencv使用add来执行图像的加法运算

图片就是矩阵, 图片的加法运算就是矩阵的加法运算, 这就要求加法运算的两张图shape必须是相同的.就是图像数据相应像素的相加。

# 加法, 加法的效果是加起来如果超过255, 统一变成255
new_img = cv2.add(new_cat, dog)

1.2 图像的减法运算

  • subtract

  • opencv使用subtract来执行图像的减法运算, 图像对应位置的元素相减, 如果减完小于0, 统一变成0.就是图像数据相应像素的相减。

# 减法
new_img = cv2.subtract(new_cat, dog)

 同样的还有乘法, 除法运算. cv2.mutiply, cv2.divide, 原理是类似的.

1.3图像融合

  • cv2.addWeighted(src1, alpha, src2, beta, gamma)

  • 图片的融合操作相当于对图片进行线性运算 w1* x1 + w2 * x2 + b. 其中alpha是第一个权重参数, beta是第二个权重参数, gamma是偏差.伽马调整

# 相当于res = new_cat * 0.4 + dog * 0.6 + 0
res = cv2.addWeighted(new_cat, 0.4, dog, 0.6, 0)

2.OpenCV的位运算

2.1 非操作

  • bitwise_not(img) 非操作的效果就相当于是用 255 - img

cat_not = cv2.bitwise_not(cat)

2.2 与运算

  • bitwise_and(img1, img2) 与运算, 图片对应位置元素进行与操作. 表现出来的效果就是黑和黑与还是黑, 白和白与还是白.

cat_and_dog = cv2.bitwise_and(new_cat, dog)

2.3 或和异或

  • bitwise_or 或运算 对应元素做或运算

  • bitwise_xor 异或运算 对应元素做异或运算

#new_img = cv2.bitwise_or(img, img2)
new_img = cv2.bitwise_xor(img, img2)

3. 图像的基本变换

3.1 图像的放大与缩小

resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

  • src: 要缩放的图片

  • dsize: 缩放之后的图片大小, 元组和列表表示均可.

  • dst: 可选参数, 缩放之后的输出图片

  • fx, fy: x轴和y轴的缩放比, 即宽度和高度的缩放比.

  • interpolation: 插值算法, 主要有以下几种:

    • INTER_NEAREST, 邻近插值, 速度快, 效果差.

    • INTER_LINEAR, 双线性插值, 使用原图中的4个点进行插值. 默认.

    • INTER_CUBIC, 三次插值, 原图中的16个点.

    • INTER_AREA, 区域插值, 效果最好, 计算时间最长.

 示例代码:

# x,y放大一倍
new_dog = cv2.resize(dog,dsize=(800, 800), interpolation=cv2.INTER_NEAREST)

3.2 图像的翻转

  • flip(src, flipCode)

    • flipCode =0 表示上下翻转

    • flipCode >0 表示左右翻转

    • flipCode <0 上下 + 左右

 示例代码:

new_dog = cv2.flip(dog, flipCode=-1)

 3.3 图像的旋转

rotate(img, rotateCode)

  • ROTATE_90_CLOCKWISE 90度顺时针

  • ROTATE_180 180度

  • ROTATE_90_COUNTERCLOCKWISE 90度逆时针

示例代码: 

new_dog = cv2.rotate(dog, rotateCode=cv2.cv2.ROTATE_90_COUNTERCLOCKWISE)

3.4.仿射变换之图像平移仿射

变换是图像旋转, 缩放, 平移的总称.具体的做法是通过一个矩阵和和原图片坐标进行计算, 得到新的坐标, 完成变换. 所以关键就是这个矩阵.

  • warpAffine(src, M, dsize, flags, mode, value)

  • M:变换矩阵 M是偏移矩阵[1 0 tx,0 1 ty, 0 0 1] 移动后坐标是(x+tx y+ty)

  • dsize: 输出图片大小

  • flag: 与resize中的插值算法一致

  • mode: 边界外推法标志

  • value: 填充边界值

示例代码:

h, w, ch = dog.shape
# M是偏移矩阵[1 0 tx,0 1 ty, 0 0 1] 移动后坐标是(x+tx y+ty)
M = np.float32([[1, 0, 100], [0, 1, 0]])
# 注意opencv中是先宽度, 再高度
new = cv2.warpAffine(dog, M, (w, h))

3.5 仿射变换之获取变换矩阵

仿射变换的难点就是计算变换矩阵, OpenCV提供了计算变换矩阵的API

  • getRotationMatrix2D(center, angle, scale)

    • center 中心点 , 以图片的哪个点作为旋转时的中心点.

    • angle 角度: 旋转的角度, 按照逆时针旋转.

    • scale 缩放比例: 想把图片进行什么样的缩放.

示例代码:

h, w, ch = dog.shape
# M = np.float32([[1, 0, 100], [0, 1, 0]])

# 注意旋转的角度为逆时针.
# M = cv2.getRotationMatrix2D((100, 100), 15, 1.0)
# 以图像中心点旋转
M = cv2.getRotationMatrix2D((w/2, h/2), 15, 1.0)
# 注意opencv中是先宽度, 再高度
new = cv2.warpAffine(dog, M, (w, h))

3.6.透视变换

 3.6.1.三个点确定变换矩阵       

getAffineTransform(src[], dst[]) 通过三点可以确定变换后的位置, 相当于解方程, 3个点对应三个方程, 能解出偏移的参数和旋转的角度.

  • src原目标的三个点

  • dst对应变换后的三个点

# 一般是横向和纵向的点, 所以一定会有2个点横坐标相同, 2个点纵坐标相同
src = np.float32([[200, 100], [300, 100], [200, 300]])
dst = np.float32([[100, 150], [360, 200], [280, 120]])
M = cv2.getAffineTransform(src, dst)
# 注意opencv中是先宽度, 再高度
new = cv2.warpAffine(dog, M, (w, h))

  3.6.2.四个点确定变换矩阵   

  • warpPerspective(img, M, dsize,....)

  • 对于透视变换来说, M是一个3 * 3 的矩阵.

  • getPerspectiveTransform(src, dst) 获取透视变换的变换矩阵, 需要4个点, 即图片的4个角.

src = np.float32([[100, 1100], [2100, 1100], [0, 4000], [2500, 3900]])
dst = np.float32([[0, 0], [2300, 0], [0, 3000], [2300, 3000]])
M = cv2.getPerspectiveTransform(src, dst)

new = cv2.warpPerspective(img, M, (2300, 3000))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB是一种用于科学计算和图像处理的强大软件工具,它提供了丰富的函数和工具箱,使我们能够对图像进行各种数学和逻辑操作。 图像运算是指对图像进行各种数学和逻辑操作,以改变图像的特征或提取有用的信息。 在MATLAB中进行图像运算的一种常见方法是使用矩阵操作。我们可以将图像表示为一个二维矩阵,其中每个元素代表图像的一个像素。通过对这些矩阵进行各种数学运算,我们可以改变图像的亮度、对比度、颜色和结构等方面。 一种常见的图像运算是调整图像的亮度和对比度。通过改变图像的像素值,我们可以增加或减少图像的亮度。类似地,通过压缩或扩展像素的值范围,我们可以改变图像的对比度。 除了亮度和对比度调整,还可以使用各种过滤器和滤波器对图像进行平滑、锐化或增强。平滑滤波器可以去除图像中的噪声,使其更清晰。锐化滤波器可以增强图像的边缘和细节。增强滤波器可以调整图像的颜色饱和度,使其更鲜艳或更柔和。 此外,还可以使用阈值化和分割方法来提取图像中的目标对象。阈值化是指将一个图像分成两个或多个部分,分割是指将图像分成不同的区域,以便进行进一步的处理和分析。 在MATLAB中,我们可以使用图像处理工具箱和相关函数来实现这些图像运算。通过调用适当的函数,并传递适当的参数,我们可以对图像进行各种运算,以满足我们的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值