(opencv)图像几何变换——缩放

这篇具有很好参考价值的文章主要介绍了(opencv)图像几何变换——缩放。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

图像缩放是指将图像的尺寸变小或变大的过程,也就是减少或增加源图像数据的像素个数。图像缩放一定程度上会造成信息的丢失,因此需要考虑适宜的方法进行操作。

下面介绍两种常用的图像缩放方法的原理及实现

1.基于等间隔提取图像缩放

等间隔提取图像缩放是通过对源图像进行均匀采样来完成的。对于源图像数据f(x,y),其分辨率为M*N,如果将其分辨率改变成m*n,对于等间隔采样而言,其宽度缩放因子k1=m/M,高度缩放因子k2=n/N,对于图像而言,图像缩放在其水平方向的等间隔采样为k1,垂直方向上的等间隔采样为k2。若满足k1=k2,源图像数据将等比例缩放,否则源图像数据的宽度和高度将发生不同程度的缩放,造成图像变形扭曲现象

opencv 图像缩放,OpenCV,计算机视觉,图像处理,人工智能

2.基于区域子块图像缩放 

区域子块提取图像缩放是通过对源图像进行区域子块划分,然后提取子块中像素值作为采样像素以构成新图像来实现的。提取子块像素值常用的方法有计算子块像素的中值与计算子块像素的均值。对源图像进行区域划分同样也有多种不同方法,常用方法是根据缩放因子等比例提取子块与自适应因子提取子块,假设源图像数据f(x,y)的分辨率为8*8,图像g(x,y)的分辨率为2*2,则区域子块提取方式如下:

opencv 图像缩放,OpenCV,计算机视觉,图像处理,人工智能 

子块区域提取后g(x,y)为下式

opencv 图像缩放,OpenCV,计算机视觉,图像处理,人工智能 

 下面分别实现这两种方式对图像进行缩放

#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;

//基于等间隔提取图像缩放
Mat imgReduction1(Mat& src, float kx, float ky)
{
	//获取输出图像分辨率
	int nRows = cvRound(src.rows * kx);
	int nCols = cvRound(src.cols * ky);
	Mat result(nRows, nCols, src.type());
	for (int i = 0; i < nRows; ++i)
	{
		for (int j = 0; j < nCols; ++j)
		{
			//根据水平因子计算坐标
			int x = static_cast<int>((i + 1) / kx + 0.5) - 1;
			//根据垂直因子计算坐标
			int y = static_cast<int>((j + 1) / ky + 0.5) - 1;

			result.at<Vec3b>(i, j) = src.at<Vec3b>(x, y);
		}
	}
	return result;
}

Vec3b areaAverage(const Mat& src, Point_<int> leftPoint, Point_<int> rightPoint)
{
	int temp1 = 0, temp2 = 0, temp3 = 0;
	//计算区域子块像素点个数
	int nPix = (rightPoint.x - leftPoint.x + 1) * (rightPoint.y - leftPoint.y + 1);
	//对于区域子块各个通道对像素值求和
	for (int i = leftPoint.x; i <= rightPoint.x; i++)
	{
		for (int j = leftPoint.y; j <= rightPoint.y; j++)
		{
			temp1 += src.at<Vec3b>(i, j)[0];
			temp2 += src.at<Vec3b>(i, j)[1];
			temp3 += src.at<Vec3b>(i, j)[2];
		}
	}
	//对每个通道求均值
	Vec3b vecTemp;
	vecTemp[0] = temp1 / nPix;
	vecTemp[1] = temp2 / nPix;
	vecTemp[2] = temp3 / nPix;
	return vecTemp;
}

//基于区域子块图像缩放
Mat imgReduction2(const Mat& src, double kx, double ky)
{
	//获取输出图像分辨率
	int nRows = cvRound(src.rows * kx);
	int nCols = cvRound(src.cols * ky);
	Mat result(nRows, nCols, src.type());

	//区域子块的左上角行列坐标
	int leftRowCoordinate = 0;
	int leftColCoordinate = 0;
	for (int i = 0; i < nRows; ++i)
	{
		//根据水平因子计算坐标
		int x = static_cast<int>((i + 1) / kx + 0.5) - 1;
		for (int j = 0; j < nCols; ++j)
		{
			//根据垂直因子计算坐标
			int y = static_cast<int>((j + 1) / kx + 0.5) - 1;
			//求解区域子块的均值
			result.at<Vec3b>(i, j) = areaAverage(src,
				Point_<int>(leftRowCoordinate, leftColCoordinate), Point_<int>(x, y));
			//更新下子块左上角的列坐标,行坐标不变
			leftColCoordinate = y + 1;
		}
		leftColCoordinate = 0;
		//更新下子块左上角的行坐标
		leftRowCoordinate = x + 1;
	}
	return result;
}
int main()
{
	Mat src = imread("C:\\Users\\32498\\Pictures\\16.png");
	if (!src.data)
	{
		return -1;
	}
	imshow("src", src);
	Mat dst1 = imgReduction1(src, 0.5, 0.5);
	imshow("dst1", dst1);
	Mat dst2 = imgReduction2(src, 0.5, 0.5);
	imshow("dst2", dst2);
	waitKey();
	return 0;

}

opencv 图像缩放,OpenCV,计算机视觉,图像处理,人工智能 

 对代码进行一些注释

  • cvRound():返回跟参数最接近的整数值,即四舍五入;

与之近似的函数还有

  • cvFloor()  :返回不大于参数的最大整数值,即向下取整;
  • cvCeil()    :返回不小于参数的最小整数值,即向上取整;
Point_<int>(x,y)

 opencv中内置了三种二维平面点坐标类型,这就带来一个问题:即我们在编写图像处理算法的时候有时候并不确定调用者需要哪一种坐标点数据类型,只写一种吧可能无法满足需要,三种都分别实现又费时耗力,且没利用好c++多态泛型的特性。而opencv中的模板类cv::Point_刚好可以解决这个问题,实际上以上三种类型的点都是cv::Point_的具体实例化,在opencv里转到定义就可以查看到

typedef Point_<int> Point2i;
typedef Point_<int64> Point2l;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;
typedef Point2i Point;

point_ 的定义如下:

template<typename _Tp> class Point_
{
public:
    typedef _Tp value_type;

    //! default constructor
    Point_();
    Point_(_Tp _x, _Tp _y);
    Point_(const Point_& pt);
    Point_(const Size_<_Tp>& sz);
    Point_(const Vec<_Tp, 2>& v);

    Point_& operator = (const Point_& pt);
    //! conversion to another data type
    template<typename _Tp2> operator Point_<_Tp2>() const;

    //! conversion to the old-style C structures
    operator Vec<_Tp, 2>() const;

    //! dot product
    _Tp dot(const Point_& pt) const;
    //! dot product computed in double-precision arithmetics
    double ddot(const Point_& pt) const;
    //! cross-product
    double cross(const Point_& pt) const;
    //! checks whether the point is inside the specified rectangle
    bool inside(const Rect_<_Tp>& r) const;
    _Tp x; //!< x coordinate of the point
    _Tp y; //!< y coordinate of the point
};

 文章来源地址https://www.toymoban.com/news/detail-595811.html

 

 

 

到了这里,关于(opencv)图像几何变换——缩放的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 我在Vscode学OpenCV 几何变换(缩放、翻转、仿射变换、透视、重映射)

    我在Vscode学OpenCV 几何变换(缩放、翻转、仿射变换、透视、重映射)

    几何变换指的是将一幅图像映射到另一幅图像内的操作。 cv2.warpAffine :使用仿射变换矩阵对图像进行变换,可以实现平移、缩放和旋转等操作。 cv2.warpPerspective :使用透视变换矩阵对图像进行透视变换,可以实现镜头校正、图像纠偏等操作。 cv2.getAffineTransform :计算仿射变换

    2024年02月05日
    浏览(18)
  • 【OpenCV • c++】图像几何变换 | 图像仿射变换

    【OpenCV • c++】图像几何变换 | 图像仿射变换

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪

    2024年02月16日
    浏览(41)
  • (opencv)图像几何变换——平移

    (opencv)图像几何变换——平移

    图像的平移操作是将图像的所有像素坐标进行水平或垂直方向移动,也就是将所有像素点按照给定的偏移量在水平方向沿x轴、垂直方向上沿y轴移动。平移变换分为两种类型:图像大小变化与图像大小不变。第一种类型保证图像平移的完整信息,第二种图像导致原始图像的部

    2024年02月08日
    浏览(9)
  • 【OpenCV • c++】图像几何变换 | 图像旋转

    【OpenCV • c++】图像几何变换 | 图像旋转

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪   图像的几何变换是指在不改变图像像素值的前提下对图像像素进

    2024年02月16日
    浏览(47)
  • 【OpenCV • c++】图像几何变换 | 图像平移

    【OpenCV • c++】图像几何变换 | 图像平移

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪

    2024年02月16日
    浏览(11)
  • 【OpenCV • c++】图像几何变换 | 图像坐标映射

    【OpenCV • c++】图像几何变换 | 图像坐标映射

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪   图像的几何变换是指在不改变图像像素值的前提下对图像像素进

    2024年02月12日
    浏览(23)
  • 【OpenCV】计算机视觉图像处理基础知识

    【OpenCV】计算机视觉图像处理基础知识

    目录 前言 推荐 1、OpenCV礼帽操作和黑帽操作 2、Sobel算子理论基础及实际操作 3、Scharr算子简介及相关操作 4、Sobel算子和Scharr算子的比较 5、laplacian算子简介及相关操作 6、Canny边缘检测的原理 6.1 去噪 6.2 梯度运算 6.3 非极大值抑制 6.4 滞后阈值 7、Canny边缘检测的函数及使用

    2024年02月05日
    浏览(11)
  • 【OpenCV】图像变换(缩放、平移、旋转、仿射)

    图像变换是指通过对图像进行缩放、平移、旋转、仿射、透视等变换来改变图像的形状和大小。在本篇博客中,我们将详细介绍OpenCV中的图像变换函数,并提供示例代码以帮助读者更好地理解这些函数的使用方法。 缩放变换是指通过改变图像的大小来改变图像的形状。在Op

    2024年02月07日
    浏览(48)
  • 【OpenCV入门】第七部分——图像的几何变换

    【OpenCV入门】第七部分——图像的几何变换

    通过resize()方法可以随意更改图像的大小比例: src: 原始图像 dsize: 输出图像的大小,格式为(宽,高),单位为像素 fx: (可选)水平方向的缩放比例 fy: (可选)竖直方向的缩放比例 interpolation: (可选)缩放的插值方式,在图像缩小或放大时需要删减或补充像素,该

    2024年02月10日
    浏览(11)
  • 计算机视觉传统图像处理库opencv的使用

    人工智能领域的图像处理分支,整理了计算机视觉传统图像处理库opencv的使用网址链接。 opencv使用范围,主要用在计算机视觉、视频分析、机器学习、医学影像处理、自动驾驶、工业检测、游戏开发上。 1):opencv效果视频 opencv10个应用场景 - 知乎 2):opencv介绍 AI必备技能

    2024年02月09日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包