12 OpenCV图像上采样pyrUp与下采样pyrDown

一、图像金字塔

  • 在进行数字图像处理时,我们可能会需要将某种尺寸的图像转换为其他尺寸的图像,这样会存在放大图像和缩小图像两种可能。
  • 一个图像金字塔是一系列图像的集合,所有图像来源于同一张原始图像,通过梯次向下采样获得,直到达到某个终止条件才停止采样。通常有两种类型的图像金字塔:
    • 高斯金字塔(Gaussian pyramid): 用来向下采样
    • 拉普拉斯金字塔(Laplacian pyramid): 用来从金字塔底层图像重建上层未采样图像,可以对图像进行最大程度的还原.
      12 OpenCV图像上采样pyrUp与下采样pyrDown_第1张图片

二、高斯金字塔

  • 高斯金字塔是从底向上,逐层降采样得到
  • 降采样之后图像大小是原图像MxN的M/2 x N/2 ,就是对原图像删除偶数行与列,即得到降采样之后上一层的图片
  • 高斯金子塔的生成过程分为两步:
    • 1.对当前层进行高斯模糊
    • 2.删除当前层的偶数行与列

三、拉普拉斯金字塔

  • 拉普拉斯金字塔是向上采样,重建上层未采样图像,在图像处理中预测残差。得到的图像比原来图像的尺寸大。
    • (1)将图像在每个方向上扩大为原来的两倍,新增的行和列以0填充
    • (2)使用先前同样的内核(乘以4)与放大后的图像卷积,或得”新增像素”的近似值
  • 得到的图像即为放大后的图像,但所与原来的图像相比会比较模糊,因为在向下采样过程中丢失了一些信息

四、高斯不同 Difference of Gaussian (DOG)

  • 就是把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像。称为高斯不同(DOG)
  • 高斯不同是图像的内在特征,在灰度图像增强、角点检测中经常用到

五、相关API

void cv::pyrDown ( InputArray src,OutputArray dst, const Size & dstsize = Size(),int borderType = BORDER_DEFAULT ) //zoom out 缩小

  • InputArray src: 输入图像,可以是Mat类型
  • OutputArray dst: 输出图像,尺寸由第三个参数指定,类型与输入图像一致
  • const Size & dstsize=Size(): 输出图像的尺寸,有默认值Size(),在默认情况下将会由Size((src.cols+1)/2, (src.rows+1)/2)计算得到并且还要满足以下条件:|dstsize.width2-src.cols|<=2       |dstsize.height2-src.rows|<=2
  • int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT

void cv::pyrUp ( InputArray src, OutputArray dst, const Size & dstsize = Size(), int borderType = BORDER_DEFAULT ) // zoom in 放大

  • InputArray src: 输入图像
  • OutputArray dst: 输出图像
  • const Size & dstsize=Size(): 输出图像尺寸,有默认值Size(),在使用默认值的情况下,输出图像的尺寸由Size((src.cols2),(src.rows2))计算得到,但是必须满足以下条件:|dstsize.width - src.cols2|<=(dstsize.width mod 2)       |dstsize.height - src.rows2|<=(dstsize.height mod 2)
  • int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT,具体可以查看函数BorderTypes获取详细信息(需要注意的是与膨胀腐蚀不同,这里不支持BORDER_CONSTANT模式)

六、示例

#include 
#include 

using namespace std;
using namespace cv;

int main()
{
     
	Mat src, dst;
	src = imread("images/08.png");
	if (!src.data) {
     
		cout << "could not load image1..." << endl;
		return -1;
	}
	namedWindow("input_image", CV_WINDOW_AUTOSIZE);
	imshow("input_image", src);

	// 上采样
	pyrUp(src, dst, Size(src.cols * 2, src.rows * 2));
	imshow("output image1", dst);

	// 降采样
	Mat s_down;
	pyrDown(src, s_down, Size(src.cols / 2, src.rows / 2));
	imshow("output image2", s_down);

	// 高斯不同 DOG
	Mat gray_src,g1, g2,dogImg;
	cvtColor(src, gray_src, CV_BGR2GRAY);
	GaussianBlur(gray_src,g1,Size(5,5),0,0);
	GaussianBlur(g1, g2, Size(5, 5), 0, 0);
	subtract(g1, g2, dogImg, Mat());
	normalize(dogImg, dogImg, 255, 0, NORM_MINMAX); // 归一化显示
	imshow("DOG image", dogImg);

	waitKey();
	return 0;
}

12 OpenCV图像上采样pyrUp与下采样pyrDown_第2张图片

你可能感兴趣的:(OpenCV图像处理,opencv,计算机视觉)