需求:
在对获取的图片进行识别的时候,如果想减少不必要因素的干扰,将图片切割只对有更多特征信息的部分带入模型识别,而剩余有较多干扰因素的部分舍弃,这就是图片切割的目的,但是又由于模型对图片的维度有较高的要求,切割后的图片在维度上已经不满足模型所需要的维度,而将被切割图片的维度恢复,进而能带入模型识别,是本次重点
对于图片处理有两种手段:
1、填充式还原
即保留的图片部分不变,剩余的被切割部分用白色填充 (当然也可以用其他的颜色填充)
函数代码:
def picture_Fill(img, boundary): # 填充函数
# 创建与原始图像相同大小的全白图像
white_frame = np.ones_like(img) * 255 # 255 白色,床创建全白图片
white_frame[0:boundary, :] = img[0:boundary, :] # 水平方向全部取出,垂直方向取0~boundary
return white_frame
即创建一个与原图片一样大小的白色图片,将需要被保留的部分填入白色图片中
2、扩大还原式
对切割后的图片进行放大,恢复到原来的维度值
函数代码:
def picture_BrowUp(img, boundary):
img_copy = img.copy() # 备份
img = img[0:boundary, :] # 截取
img = cv2.resize(img, (img_copy.shape[1], img_copy.shape[0]), interpolation=cv2.INTER_LINEAR) # 放大
return img
获取原本图片的所有维度大小,在扩大的过程中指定扩大的大小值
测试:
切割目标:
1、填充式测试
代码:
import matplotlib.pyplot as plt
import cv2
import numpy as np
def picture_BrowUp(img, boundary):
img_copy = img.copy() # 备份
img = img[0:boundary, :] # 截取
img = cv2.resize(img, (img_copy.shape[1], img_copy.shape[0]), interpolation=cv2.INTER_LINEAR) # 放大
return img
def picture_Fill(img, boundary): # 填充函数
# 创建与原始图像相同大小的全白图像
white_frame = np.ones_like(img) * 255 # 255 白色,床创建全白图片
white_frame[0:boundary, :] = img[0:boundary, :] # 水平方向全部取出,垂直方向取0~boundary
return white_frame
# 读取原始图像
frame = cv2.imread('C:\\Users\\86153\\Pictures\\Camera Roll\\1.png') # 请将 'your_image_path.jpg' 替换为你的图像路径
frame = picture_Fill(frame, 300) # 填充函数
plt.imshow(frame)
plt.axis('off') # 关闭坐标轴
plt.show()
效果:
2、扩大式测试
代码:
import matplotlib.pyplot as plt
import cv2
import numpy as np
def picture_BrowUp(img, boundary):
img_copy = img.copy() # 备份
img = img[0:boundary, :] # 截取
img = cv2.resize(img, (img_copy.shape[1], img_copy.shape[0]), interpolation=cv2.INTER_LINEAR) # 放大
return img
def picture_Fill(img, boundary): # 填充函数
# 创建与原始图像相同大小的全白图像
white_frame = np.ones_like(img) * 255 # 255 白色,床创建全白图片
white_frame[0:boundary, :] = img[0:boundary, :] # 水平方向全部取出,垂直方向取0~boundary
return white_frame
# 读取原始图像
frame = cv2.imread('C:\\Users\\86153\\Pictures\\Camera Roll\\1.png') # 请将 'your_image_path.jpg' 替换为你的图像路径
frame = picture_BrowUp(frame, 300) # 填充函数
plt.imshow(frame)
plt.axis('off') # 关闭坐标轴
plt.show()
效果:
实践效果评价:
从机器识别上述处理过的图片来看,填充式的效果更加好,其原因在于将不必要的部分用白色代替,减少了不必要的干扰,而扩大式的识别较差,可能是图片的放大损坏了图片的空间结构,也不难排除扩大操作耗费的时间较多导致识别过慢,当然也和所用的识别图片模型的不同有关。
补充:
OpenCV(cv2库)是一个开源计算机视觉库,它提供了许多用于图像处理、计算机视觉和机器学习的功能。这个库被广泛应用于各种各样的领域,包括图像处理、视频分析、对象识别、人脸识别、机器视觉等领域。
它提供了丰富的函数和工具,用于加载、保存、处理图像和视频。OpenCV
能够执行图像的基本操作(如裁剪、调整大小、旋转等),还能进行更高级的图像处理(如图像滤波、边缘检测、特征提取等)。此外,它还提供了许多机器学习算法的实现,用于对象检测、人脸识别、姿态估计等任务。这个库支持多种编程语言,包括 C++、Python、Java 等,让开发者能够在不同的平台上使用相同的功能。OpenCV
在计算机视觉和图像处理领域是一个非常强大和受欢迎的工具。
图片的维度和pytorch的维度排布有所差别例如图片的shape为(500, 720, 3)那么其高度、宽度、通道数分别为500、720、3而对将图片转化成pytorch张量之后就变成了(3, 500, 720)即通道数,高度宽度
转换代码如下:
# 转换为 PyTorch Tensor,并调整维度
image_tensor = torch.from_numpy(np.transpose(image, (2, 0, 1))) # 调整维度为 (通道数, 高度, 宽度)
至于为什么要把图片转换为 pytorch (张量),因为一般训练出来的模型都是用张量数据的图片训练出来的,直接用图片的话,维度不一样,会报错
而且张量的优势在于其能添加一个批量大小维度,这样能一次性识别多个图片,这一样问题就转化成上节的多类分类问题
添加维度代码:
# 如果你有多张图片,可以添加批量维度
# image_tensor = image_tensor.unsqueeze(0) # 添加批量维度,变成 (1, 3, 500, 720) 形状的 Tensor
一般模型都是有批量维度,也就是说有四维,如果仅仅用三维图片张量是无法带入模型识别的,所以必须添加批量维度