预处理图像数据
概述
图像预处理的主要目的是消除图像中无关的信息,恢复有用的真实信息,增强有关信息的可检测性和最大限度地简化数据,从而改进特征抽取、图像分割、匹配和识别的可靠性。此处是通过创建LiteMat对象,在推理前对图像数据进行处理,达到模型推理所需要的数据格式要求。
流程如下:
导入图像预处理函数的库
#include "lite_cv/lite_mat.h"
#include "lite_cv/image_process.h"
对图像进行初始化
这边使用的是image_process.h
文件中的InitFromPixel函数对图像进行初始化操作。
bool InitFromPixel(const unsigned char *data, LPixelType pixel_type, LDataType data_type, int w, int h, LiteMat &m)
使用示例
// Create the data object of the LiteMat object.
LiteMat lite_mat_bgr;
// Initialize the lite_mat_bgr object.
// The image data pointer passed in by the user (The data in the Bitmap corresponding to the Android platform).
InitFromPixel(pixel_ptr, LPixelType::RGBA2GRAY, LDataType::UINT8, rgba_mat.cols, rgba_mat.rows, lite_mat_bgr);
可选的图像预处理算子
此处的图像处理算子,用户可以根据实际情况任意搭配使用。
对图像进行缩放操作
这边利用的是image_process.h
中的ResizeBilinear函数通过双线性算法调整图像大小,当前仅支持的数据类型为uint8,当前支持的通道为3和1。
bool ResizeBilinear(const LiteMat &src, LiteMat &dst, int dst_w, int dst_h)
使用示例
// Initialize the image data.
LiteMat lite_mat_bgr;
InitFromPixel(rgba_mat.data, LPixelType::RGBA2BGR, LDataType::UINT8, rgba_mat.cols, rgba_mat.rows, lite_mat_bgr);
// Create a resize image data object.
LiteMat lite_mat_resize;
// Resize the image.
ResizeBilinear(lite_mat_bgr, lite_mat_resize, 256, 256);
对图像数据类型进行转换
这边利用的是image_process.h
中的ConvertTo函数对图像数据类型进行转换,目前支持的转换是将uint8转换为float。
bool ConvertTo(const LiteMat &src, LiteMat &dst, double scale = 1.0)
使用示例
// Initialize the image data.
LiteMat lite_mat_bgr;
InitFromPixel(rgba_mat.data, LPixelType::RGBA2BGR, LDataType::UINT8, rgba_mat.cols, rgba_mat.rows, lite_mat_bgr);
// Create the converted data type object.
LiteMat lite_mat_convert_float;
// Perform conversion type operations on the object. The currently supported conversion is to convert uint8 to float.
ConvertTo(lite_mat_bgr, lite_mat_convert_float);
对图像数据进行裁剪
这边利用的是image_process.h
中的Crop函数对图像进行裁剪,目前支持通道3和1。
bool Crop(const LiteMat &src, LiteMat &dst, int x, int y, int w, int h)
使用示例
// Initialize the image data.
LiteMat lite_mat_bgr;
InitFromPixel(rgba_mat.data, LPixelType::RGBA2BGR, LDataType::UINT8, rgba_mat.cols, rgba_mat.rows, lite_mat_bgr);
// Create the cropped object.
LiteMat lite_mat_cut;
// The image is cropped by the values of x, y, w, h.
Crop(lite_mat_bgr, lite_mat_cut, 16, 16, 224, 224);
对图像数据进行归一化处理
为了消除数据指标之间的量纲影响,通过标准化处理来解决数据指标之间的可比性问题,这边利用的是image_process.h
中的SubStractMeanNormalize函数对图像数据进行归一化处理。
bool SubStractMeanNormalize(const LiteMat &src, LiteMat &dst, const std::vector<float> &mean, const std::vector<float> &std)
使用示例
// Initialize the image data.
LiteMat lite_mat_bgr;
InitFromPixel(rgba_mat.data, LPixelType::RGBA2BGR, LDataType::UINT8, rgba_mat.cols, rgba_mat.rows, lite_mat_bgr);
// The mean value of the image data.
// The variance of the image data.
std::vector<float> means = {0.485, 0.456, 0.406};
std::vector<float> stds = {0.229, 0.224, 0.225};
// Create a normalized image object.
LiteMat lite_mat_bgr_norm;
// The image data is normalized by the mean value and variance of the image data.
SubStractMeanNormalize(lite_mat_bgr, lite_mat_bgr_norm, means, stds);