C++Opencv图像像素类型转换、归一化和放缩插值

1.convertTo() 数据类型转换

src.convertTo(dst, type, scale, shift)
缩放并转换到另外一种数据类型:
dst:目的矩阵;
type:需要的输出矩阵类型,或者更明确的,是输出矩阵的深度,如果是负值(常用-1)则输出矩阵和输入矩阵类型相同;
scale:比例因子;
shift:将输入数组元素按比例缩放后添加的值;

2.normalize() 归一化

void cv::normalize	(	InputArray 	src,
						InputOutputArray 	dst,
						double 	alpha = 1,
						double 	beta = 0,
						int 	norm_type = NORM_L2,
						int 	dtype = -1,
						InputArray 	mask = noArray())
参数解析:
src:输入
dst:输出
alpha:归一化目标值(范围归一化中的下边界)
beta:(范围归一化中的上边界),其他情况无效
norm_type:归一化方法
NORM_MINMAX    数组的数值被平移或缩放到一个指定的范围,线性归一化(图像数据最常用)
NORM_INF       归一化数组的(切比雪夫距离)L∞范数(绝对值的最大值)
NORM_L1        归一化数组的(曼哈顿距离)L1-范数(和的绝对值)
NORM_L2        归一化数组的(欧几里德距离)L2-范数
dtype:当为负数的时候,输出数据类型和输入一致;否则输出的通道数和输入一致,输出的数据类型和这里设置的一致
mask:掩膜

3.resize() 函数

调整图像大小意味着改变它的尺寸,无论是宽度、高度还是两者都改变​​。此外,原始图像的纵横比可以保留在调整大小的图像中。为了调整图像大小,OpenCV 提供了 resize() 函数

void cv::resize (InputArray src,OutputArray dst,Size dsize,double fx = 0,double fy = 0,
			int interpolation = INTER_LINEAR)
参数
src - 输入图像。
dst - 输出图像;它的大小为 dsize(当它非零时)或从 src.size()、fx 和 fy 计算的大小;dst 的类型与 src 的类型相同。
dsize - 输出图像大小;如果它等于零,则计算为:dsize = Size(round(fx*src.cols), round(fy*src.rows))。dsize 或 fx 和 fy 必须为非零。
fx - 沿水平轴的比例因子;当它等于 0 时,它被计算为(double)dsize.width/src.cols
fy - 沿垂直轴的比例因子;当它等于 0 时,它被计算为(double)dsize.height/src.rows
interpolation - 插值方法
INTER_NEAREST- 最近邻插值(最近邻插值) -
INTER_LINEAR双线性插值(默认使用)
INTER_AREA- 使用像素区域关系重采样。它可能是图像抽取的首选方法,因为它可以提供无莫尔条纹的结果。
但是当图像被缩放时,它类似于 INTER_NEAREST 方法。
INTER_CUBIC- 4x4 像素邻域上的双三次插值
INTER_LANCZOS4- 8x8 像素邻域上的 Lanczos 插值

PS: 要缩小图像,通常使用INTER_AREA插值效果最好,而要放大图像,
通常使用CV_INTER_CUBIC(慢)或INTER_LINEAR(更快但看起来还可以)效果最好。

示例代码:

void normalize_demo(Mat& image) {
	Mat dst;
	cout << "变换前的type:" << image.type() << endl;
	image.convertTo(image,CV_32F);
	cout << "变换后的type:" << image.type() << endl;
	normalize(image, dst, 1.0, 0, NORM_MINMAX);
	imshow("图像归一化", dst);
	
}

void resize_demo(Mat& image) {
	Mat zoomin, zoomout;
	int h = image.rows;
	int w = image.cols;
	resize(image, zoomin, Size(w / 2, h / 2), 0, 0, INTER_AREA);  //缩小到2/1
	imshow("zoomin", zoomin);
	resize(image, zoomout, Size(w * 1.5, h * 1.5), 0, 0, INTER_LINEAR);  //放大1.5倍
	imshow("zoomout", zoomout);
}

void test1501()
{
	Mat image = imread("C:/Users/86156/Pictures/Saved Pictures/cwt.jpg");
	imshow("图像", image);
	normalize_demo(image);
	waitKey(0);
}


int main()
{
	test1501();
	system("pause");
}

图像归一化
C++Opencv图像像素类型转换、归一化和放缩插值_第1张图片
图像放缩
C++Opencv图像像素类型转换、归一化和放缩插值_第2张图片

你可能感兴趣的:(Opencv(C++),opencv,c++,计算机视觉)