图像操作
基本操作
图像有他自己的属性,宽、高、通道数。其中宽(w)、高(h)是能够直接观察的到的,通道数则是呈现图像信息的属性。常见的通道如光学三原色的组合R、G、B三个通道,而事实上还存在其他的通道如RGBA、YCrCb、HSV等,每个通道的取值范围在0~255(28)。因此每一个彩色图像在被读取后存储在内存中的都是一个h×w×c的矩阵(当图像为灰色图像时通道数c为1)。
基于这个特性便可以利用Numpy对图像进行简单的编辑。
1、访问部分图像
在图像中无效的信息会很多,例如再识别车牌信息时所需要的仅仅时车牌牌子附近的一些图像,所以单独选择车牌这一块的进行识别而不是对整个图像进行识别。
如上面的车牌信息是一个350×600×3的图片,因此筛选其车牌的位置在图中大概是在中间的位置,所以筛选高在120-299之间,宽在180-370之间,提取为im3并将其显示,便得到了只含有车牌信息的图片。
im3 = im1[120:200, 180:370]
同时不仅可以选择部分图片,也可以通过直接修改像素的通道参数简单编辑图片颜色。将im3的红色通道R赋值0,便得到了下面这个图。
im3[:, :, 2] = 0
2、图像边界的制作
以copyMakeBorder()函数实现
参数->
src为输入的图像,
top、bottom等都是在不同方向上拓宽边界的长度,
borderType为添加边框的类型,主要有以下五种:
cv.BORDER CONSTANT ---> 添加一个恒定的边框,value的值会作为颜色
cv.BORDER REFLECT ---> 将边框从原来的镜像过去,从最边缘开始镜像
cv.BORDER DEFAULT ---> 将最边缘的像素复制
cv.BORDER REPLICATE ---> 和REFLECT的类似,不过从边缘处向里一个像素格开始
cv.BORDER WRAP ---> 不太好解释,右侧的把左侧的复制过去了,同时左侧把右侧的复制过去
import cv2
import numpy as np
from matplotlib import pyplot as plt
#读取图片
im1 = cv2.imread('car_test2.jpg', flags=cv2.IMREAD_COLOR)
#尝试不同的边框
replicate = cv2.copyMakeBorder(im1, 40, 40, 40, 40, cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(im1, 40, 40, 40, 40, cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(im1, 40, 40, 40, 40, cv2.BORDER_REFLECT101)
wrap = cv2.copyMakeBorder(im1, 40, 40, 40, 40, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(im1, 40, 40, 40, 40, cv2.BORDER_CONSTANT, value= BLUE)
#用plt将其展示出来
plt.subplot(231),plt.imshow(im1),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate, 'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect, 'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101, 'gray'),plt.title('REFLECT101')
plt.subplot(235),plt.imshow(wrap, 'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant, 'gray'),plt.title('CONSTANT')
plt.show()