AvicMat 矩阵归一化函数 avic_mat_normalize() - 将矩阵像素值缩放到指定范围
"int avic_mat_normalize(const AvicMat* src, AvicMat* dst, double alpha, double beta, int norm_type)\n{\n\t\tint src_cn = AVICCV_MAT_CN(src->type);\n\t\tint src_depth = AVICCV_MAT_DEPTH(src->type);\n\t\tint src_elem_size = AVICCV_ELEM_SIZE(src->type);\n\t\tint src_size = src_elem_size / src_cn;\n\n\t\tint dst_cn = AVICCV_MAT_CN(dst->type);\n\t\tint dst_depth = AVICCV_MAT_DEPTH(dst->type);\n\t\tint dst_elem_size = AVICCV_ELEM_SIZE(dst->type);\n\t\tint dst_size = dst_elem_size / dst_cn;\n\n\t\tint i, j, k, src_size_multi_cn, dst_size_multi_cn;\n\n\t\tswitch (norm_type)\n\t\t{\n\t\tcase AVICCV_NORM_MINMAX:\n\t\t{\n\t\t\tdouble smin = 0, smax = 0;\n\t\t\tAvicPoint2i min_loc, max_loc;\n\t\t\tdouble dmin = AVICCV_MIN(alpha, beta), dmax = AVICCV_MAX(alpha, beta);\n\t\t\tdouble need_max_min_sub = dmax - dmin;\n\t\t\tavic_min_max_loc(src, &smin, &smax, &min_loc, &max_loc);\n\t\t\tdouble src_max_min_sub = smax - smin;\n\n\t\t\tfor (k = 0; k < src_cn; k++) //channel\n\t\t\t{\n\t\t\t\tsrc_size_multi_cn = k * src_size;\n\t\t\t\tdst_size_multi_cn = k * dst_size;\n\t\t\t\tfor (i = 0; i < src->rows; i++) //rows\n\t\t\t\t{\n\t\t\t\t\tfor (j = 0; j < src->cols; j++) //cols\n\t\t\t\t\t{\n\t\t\t\t\t\tif (src_depth == AVICCV_8U)\n\t\t\t\t\t\t\t*(float*)(dst->data.ptr + (i * src->cols + j)dst_elem_size + dst_size_multi_cn) = AVIC_CV_MUL_DIV(((unsigned char*)(src->data.ptr + (i * src->cols + j)src_elem_size + src_size_multi_cn) - smin), need_max_min_sub, src_max_min_sub) + dmin;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t(float*)(dst->data.ptr + (i * src->cols + j)dst_elem_size + dst_size_multi_cn) = AVIC_CV_MUL_DIV(((float*)(src->data.ptr + (i * src->cols + j)*src_elem_size + src_size_multi_cn) - smin), need_max_min_sub, src_max_min_sub) + dmin;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t\t// 其他归一化类型处理\n\t\t// ...\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\treturn 0;\n}\n"该段代码是实现对输入矩阵src进行归一化处理,并将结果存储到输出矩阵dst中。归一化可以将矩阵的像素值范围缩放到指定的范围内。\n\n代码首先获取输入矩阵和输出矩阵的通道数、深度、元素大小等信息。\n\n然后根据指定的归一化类型(norm_type)进行不同的处理。\n\n当归一化类型为AVICCV_NORM_MINMAX时,需要指定归一化的范围(alpha和beta)。代码首先使用avic_min_max_loc函数获取输入矩阵中的最小值(smin)、最大值(smax)以及对应的位置(min_loc和max_loc)。\n\n然后计算需要进行归一化的范围的最小值(dmin)和最大值(dmax)。\n\n接下来,代码通过两层循环遍历输入矩阵的每个像素,并根据输入矩阵的深度类型进行不同的处理。\n\n如果输入矩阵的深度为AVICCV_8U,代码将输入矩阵中的像素值减去最小值(smin),然后将结果乘以归一化范围的大小(need_max_min_sub),再除以输入矩阵的最大值和最小值之差(src_max_min_sub),最后再加上归一化的最小值(dmin)。将得到的结果存储到输出矩阵的对应位置。\n\n如果输入矩阵的深度不是AVICCV_8U,代码将输入矩阵中的像素值减去最小值(smin),然后将结果乘以归一化范围的大小(need_max_min_sub),再除以输入矩阵的最大值和最小值之差(src_max_min_sub),最后再加上归一化的最小值(dmin)。将得到的结果存储到输出矩阵的对应位置。\n\n最后,代码结束归一化处理。\n
原文地址: https://www.cveoy.top/t/topic/qxZm 著作权归作者所有。请勿转载和采集!