OpenCV进阶--图像变换

Posted 狗子不帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV进阶--图像变换相关的知识,希望对你有一定的参考价值。

一、图像连接

        图像连接是指两个具有相同高度或者宽度的图像连接到一起,图像的下(左)边缘是另一个上(右)边缘,图像连接常在需要对两幅图像内容进行对比的时候用到的。在OpenCV中针对图像左右连接和上下连接提供了两种不同的函数,vconcat()函数用于实现图像或矩阵数据的上下连接,hconcat()函数用于实现图像或矩阵数据的左右连接。

vconcat()函数原型 1:

void cv::vconcat(const Mat* src,
                 size_t nsrc,
                 OutputArray dst
                )

src:Mat矩阵类型的数组。数组中所有的Mat类型具有相同的列数并且具有相同的数据类型和通道数。

nsrc:数组中Mat类型数据的数目。

dst:连接后Mat类矩阵。结果的宽度与第一个Mat类型数据相同,高度为数组中所有Mat类型数据高度的总合,并且与第一个Mat类型数据具有相同的数据类型和通道数。

vconcat()函数原型 2:

void cv::vconcat(InputArray src1,
                 InputArray src2,
                 OutoutArray dst
                )

src1:第一个需要连接的Mat类矩阵。

src2:第二个需要连接的Mat类矩阵,与第一个参数具有相同的宽度,数据类型和通道数。

dst;连接后的Mat类矩阵。

        hconcat()函数与vconcat()函数的参数和意义都是一样的,只是hconcat()函数是左右连接。

hconcat()函数原型1:

void cv::hconcat(const Mat* src,
                 size_t nsrc,
                 OutputArray dst
                )

src:Mat矩阵类型的数组。数组中所有的Mat类型具有相同的列数并且具有相同的数据类型和通道数。

nsrc:数组中Mat类型数据的数目。

dst:连接后Mat类矩阵。结果的宽度与第一个Mat类型数据相同,高度为数组中所有Mat类型数据高度的总合,并且与第一个Mat类型数据具有相同的数据类型和通道数。

hconcat()函数原型2:

void cv::hconcat(InputArray src1,
                 InputArray src2,
                 OutoutArray dst
                )

src1:第一个需要连接的Mat类矩阵。

src2:第二个需要连接的Mat类矩阵,与第一个参数具有相同的宽度,数据类型和通道数。

dst;连接后的Mat类矩阵。

代码实例:

#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>

using namespace std;
using namespace cv;

int main()
{	
	//矩阵数组的横竖连接
	Mat matArray[] = { Mat(1, 2, CV_32FC1, cv::Scalar(1)),
		Mat(1, 2, CV_32FC1, cv::Scalar(2)) };
	Mat vout, hout;
	vconcat(matArray, 2, vout);
	cout << "图像数组的竖向连接:" << endl << vout << endl;
	hconcat(matArray, 2, hout);
	cout << "图像数组的横向连接:" << endl << hout << endl;
	waitKey(0);

	//矩阵的横竖拼接
	Mat A = (cv::Mat_<float>(2, 2) << 1, 7, 2, 8);
	Mat B = (cv::Mat_<float>(2, 2) << 4, 10, 5, 11);
	Mat vC, hC;
	vconcat(A, B, vC);
	cout << "多个图像竖向连接:" << endl << vC << endl;
	hconcat(A, B, hC);
	cout << "多个图像横向连接:" << endl << hC << endl;
	return 0;
}

二、图像尺寸变换

        顾名思义尺寸变换实际上就是改变图像的长和宽,实现图像的缩放。在OpenCV中提供了resize()函数把图像修改尺寸。

resize()函数原型:

void cv::resize(InputArray src,
                OutputArray dst,
                Size dsize,
                double fx = 0,
                double fy = 0,
                int interpolation = INTER_LINEAR
                )

src:输入图像。

dst:输出图像,图像的数据类型与src相同。

dsize:输出图像的尺寸。

fx:水平轴的比例因子,如果将水平轴变为原来的两倍,则赋值为2。

fy:   垂直轴的比例因子,如果将垂直轴变为原来的两倍,则赋值为2。

interpolation:插值方法的标志,可选参数在下表中给出。

插值方法标志
标志参数简记作用
INTER_NEAREST0最近邻插值法
INTER_LINEAR1双线性插值法(通常用于放大图像)
INTER_CUBIC2双三次插值(通常用于放大图像)
INTER_AREA3使用像素区域关系重新采样,首选用于图像缩小,图像放大时效果与INTER_NEAREST相似
INTER_LANCZOS44Lanczos插值法
INTER_LINEAR_EXACT5位精确双线性插值法
INTER_MAX6用掩码进行插值

        这几天懈怠了,不行的坚持写,坚持!坚持!坚持!

以上是关于OpenCV进阶--图像变换的主要内容,如果未能解决你的问题,请参考以下文章

灰度图像直方图变换的一些代码

pyhton—opencv直线检测(HoughLines)找到最长的一条线

pyhton—opencv直线检测(HoughLines)找到最长的一条线

OpenCV图像线性变换(图像线性混合亮度和对比度增强线性变换API)

OpenCV实战(14)——图像线条提取

Python+opencv 机器视觉 - 基于霍夫圈变换算法检测图像中的圆形实例演示