昨天学习了两张或者两张以上的图像的加法运算,以及它们之间的融合;今天学习对单一的一张图像进行处理,为的是在获取有限图像时,通过图像增强后可以获得更多的图像集、数据库,以便于作为神经网络的训练样本。
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
每天觉得学会了很多知识,反思后又觉得什么也没学会,因为会觉得想这些只是基础,以后可能用不到,那不就等于白学。
但转念一想,什么是才能用的到,什么又是用不到