python+opencv图像处理(五)——图像缩放、旋转、翻转、平移

昨天学习了两张或者两张以上的图像的加法运算,以及它们之间的融合;今天学习对单一的一张图像进行处理,为的是在获取有限图像时,通过图像增强后可以获得更多的图像集、数据库,以便于作为神经网络的训练样本。

1. 图像缩放

图像缩放是把图像的长和宽放大或缩小,改变的图像的整体大小,并不是裁剪图片。具体是放大(缩小)的图像的分辨率还是像素,我目前还没弄清楚。
像素和分辨率的概念目前我还没理解透,有机会我要找位大神请教一下。

程序运行代码如下:

import cv2

#读取图片
src = cv2.imread('D:\pythonb\w01.jpg') #1080x1440  长:1440;宽:1080
print(src.shape)                       #(1440,1080,3) (宽,长,通道)

获取图像像素的行数和列数

rows, cols= src.shape[:2]           
print(rows,cols)                       #行数(宽):1440;列数(长):1080

图像缩放【列(长)x0.5,行(宽)x0.5)】
法一:乘以缩放系数

result1 = cv2.resize(src, (int(cols * 0.5), int(rows * 0.5)))

法二:利用(fx,fy)缩放倍数

result2 = cv2.resize(src, None, fx=0.5, fy=0.5)  #fx:长度(列)

#输出缩放后的图像尺寸
print(result1.shape)
print(result2.shape)

运行输出结果:
(1440, 1080, 3)
1440 1080
(720, 540, 3)
(720, 540, 3)

2.图像旋转

图像旋转的核心函数为:
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 1)
参数:旋转中心 旋转度数(±决定旋转方向) scale(1:不变;2:放大1倍)
rotated = cv2.warpAffine(src, M, (cols, rows))
参数:原始图像 旋转参数 元素图像宽高

程序运行代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
#加入中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc",size = 14)

#读取图片,并转换图像模式
img= cv2.imread('D:\pythonb\wx01.jpg')
src = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#获取原图的高、宽 以及通道数
rows, cols, channel = src.shape[ :3]

绕图像的中心(长和宽的中点)旋转

M = cv2.getRotationMatrix2D((cols / 2, rows / 2), -45, 1)
rotated = cv2.warpAffine(src, M, (cols, rows))

3.图像翻转

图像翻转的核心函数为:dst = cv2.flip(src, flipCode)
其中src表示原始图像,flipCode表示翻转方向,
flipCode=0,则以X轴为对称轴翻转,
fliipCode>0,则以Y轴为对称轴翻转,
flipCode<0,则在X轴、Y轴方向同时翻转。

程序代码如下:紧接着2部分

img1 = cv2.flip(src, 0)
img2 = cv2.flip(src, 1)
img3 = cv2.flip(src, -1)

#显示图像
titles = ['原图', '旋转图像','绕X轴翻转', '绕y轴翻转', '绕两轴同时翻转']
images = [src, rotated,img1, img2, img3]
for i in range(5):
    plt.subplot(2, 3, i + 1)
    plt.imshow(images[i])
    plt.title(titles[i],FontProperties=font)
    plt.xticks([]), plt.yticks([])
plt.show()

运行结果如下:
在这里插入图片描述

4.图像平移

图像平移首先定义平移矩阵M,再调用warpAffine()函数实现平移,核心函数如下:
M = np.float32([[1, 0, x], [0, 1, y]]) (x,y)是缩放前的坐标
shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
程序运行代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt

from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc",size = 14)

# 读取图片
img = cv2.imread('D:\pythonb\w02.png')
image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 图像向下、上、右、左平移
M = np.float32([[1, 0, 20], [0, 1, 100]])
img1 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

M = np.float32([[1, 0, 0], [0, 1, -100]])
img2 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

M = np.float32([[1, 0, 100], [0, 1, 0]])
img3 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

M = np.float32([[1, 0, -100], [0, 1, 0]])
img4 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

# 显示图形
titles = ['向下', '向上', '向右', '向左']
images = [img1, img2, img3, img4]
for i in range(1,5):                 #生成随机数[1,2,3,4]
    plt.subplot(2, 2, i )            #数组下标从1开始 1,2,3,4
    plt.imshow(images[i-1])          #依次显示images[0](img)、images[1]····images[3](img4)
    plt.title(titles[i-1],FontProperties=font)
    plt.xticks([]), plt.yticks([])
plt.show()

运行结果如下:
在这里插入图片描述
(by dxz 2020 03 14 16:35) 文中代码参考:https://blog.csdn.net/Eastmount/article/details/82454335

每天觉得学会了很多知识,反思后又觉得什么也没学会,因为会觉得想这些只是基础,以后可能用不到,那不就等于白学。
但转念一想,什么是才能用的到,什么又是用不到

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值