精华内容
下载资源
问答
  • 图像等比例缩小OpenCV

    千次阅读 2016-11-05 00:36:45
    横屏或竖屏依然保持图像比例,并自动居中,空余部分留黑边     1.横屏的情况   2.竖屏的情况   细心的同学应该有发现以上代码有个小瑕疵(即没有充分填满),但是经过简单的修改就...

     

    原图:1000 * 667

     

    C++代码(代码较简单,意在抛砖引玉):

     

    nt main()
    {
    	cv::Mat img = cv::imread("../Daniel Norris.jpg", 0);
    
    	int w = img.cols;
    	int h = img.rows;
    
    	float t = 1.;											
    
    	//int dst_w = 640, dst_h = 480; // 长宽不能都大于原图尺寸
    	int dst_w = 480, dst_h = 640;
    	cv::Mat dst = cv::Mat(cv::Size(dst_w, dst_h), CV_8UC1, cv::Scalar(0));
    
    	float len = t * std::max(w, h);			
    	float len_ = std::min(dst_w, dst_h);		
    	
    	float ratio = len_ / len;							
    
    	int w_ = ratio * w;									
    	int h_ = ratio * h;
    	int delta_x = (dst_w - w_) / (2 * ratio);	
    	int delta_y = (dst_h - h_) / (2 * ratio);	
    
    	for (int i=0; i<w; i++)
    	{
    		for (int j=0; j<h; j++)
    		{
    			float u = (i + delta_x) / len ;
    			float v = (j + delta_y) / len  ;
    
    			int x = u * len_;
    			int y = v * len_;
    
    			dst.at<uchar>(y, x) = img.at<uchar>(j, i);
    		}
    	}
    
    	imshow("Result", dst);
    	cv::waitKey(0);
    
    
        return 0;
    }
    

     

     

    效果图:

    横屏或竖屏依然保持图像比例,并自动居中,空余部分留黑边

     

     

    1.横屏的情况

     

    2.竖屏的情况


     

    细心的同学应该有发现以上代码有个小瑕疵(即没有充分填满),但是经过简单的修改就可以实现以下的效果:

     

    横图测试

     

    竖图测试

     

     

     

     

     

     

    展开全文
  • C++opencv图像裁剪、等比例放大缩小

    千次阅读 2020-07-05 16:58:58
    C++使用opencv时,对imshow图像进行的常见处理,包括图像剪裁、等比例压缩等(待继续补充) 代码 1. 剪裁 int matrix_size = 3000; cv::Mat image(matrix_size, matrix_size, CV_8UC3, cv::Scalar(255, 255, 255)); ...

    描述

    C++使用opencv时,对imshow图像进行的常见处理,包括图像剪裁、等比例压缩等(待继续补充)

    代码

    1. 剪裁

    int matrix_size = 3000;
    cv::Mat image(matrix_size, matrix_size, CV_8UC3, cv::Scalar(255, 255, 255)); // 原图
    cv::Mat image_part = image(cv::Rect(1400,1100,1000,1800)); // 裁剪后的图
    cv::imshow("part of original image", image_part);
    cv::waitKey(5);
    

    代码中
    cv::Rect是opencv画的矩形,四个参数分别为矩形(左上角的column值,左上角的row值,矩形column方向上的宽,矩形row方向上的宽)

    2. 等比例缩小

    int matrix_size = 3000;
    cv::Mat image(matrix_size, matrix_size, CV_8UC3, cv::Scalar(255, 255, 255)); // 原图
    cv::Mat image_mini; // 等比例缩小图
    resize(image, image_mini, cv::Size(matrix_size/3, matrix_size/3)); // 缩小操作
    cv::imshow("mini of original image", image_mini);
    cv::waitKey(5);
    

    3. 等比例放大

    int matrix_size = 3000;
    cv::Mat image(matrix_size, matrix_size, CV_8UC3, cv::Scalar(255, 255, 255)); // 原图
    cv::Mat image_max; // 等比例放大图
    resize(image, image_max, Size(matrix_size * 2, matrix_size * 2)); // 放大操作
    cv::imshow("max of original image", image_max);
    cv::waitKey(5);
    

    resize()函数的参数

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

    参数含义

    • src(必填): 原图像

    • dst(必填): 变换后的图像

    • dsize(必填): 写法cv::Size(col, row),变换后的图像尺寸

    • fx 和 fy(自由选填): 缩放系数,1为不变,<1缩小,>1放大。如果 Size 被设置的话,则根据 Size 做缩放插值;如果没写Size,需要根据 fx 和 fy 做缩放插值。
      以下两种写法一致

      resize(image, image_mini, cv::Size(image.cols/2, image.rows));
      resize(image, image_mini, cv::Size(), 0.5, 1);
      
    • interpolation(自由选填): 插值算法,自行去研究,不填写就是默认为0, 也就是最近点插值INTER_NEAREST

    展开全文
  • 本人是北京某985学生,这个是我在学习opencv时写的小程序,可以横向拼接图片和纵向拼接图片,还有拼接后缩小图像的功能,主要运用矩形区域的方法,初学,可能写的不太好,望见谅
  • 图像金字塔 图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。 一幅图像的金字塔是一系列以金字塔形状排列的...一张图像不断的缩小,大图在下,小图在上,看起来就是一个...

    一、图像缩放resize

    1. 概念

    resize函数可以将源图像精确地转化为指定尺寸的目标图像。

    缩小图像,推荐使用CV_INETR_AREA来插值;
    放大图像,推荐使用CV_INTER_LINEAR。

    pyrUp, pyrDown其实和专门用作放大缩小图像尺寸的resize在功能上差不多。

    另外需要指出的是, pyrUp, pyrDown在OpenCV的imgproc模块中的 Image Filtering子模块里。而resize在imgproc模块的Geometric mage Transformations子模块里。

    • 说明
      用于改变矩阵的行数.
    • 声明
      void cv::Mat::resize(size_t sz);	
      

    2. 调用方式

    2.1 规定图片的尺寸

    	//图片的缩小与放大
    	int main()
    	{
    	    Mat img = imread("D:/test/1.jpg");
    	    imshow("原始图", img);
    	 
    	    Mat dst = Mat::zeros(512, 512, CV_8UC3); //转化为512*512大小的
    	    resize(img, dst, dst.size());
    	    imshow("尺寸调整之后", dst);
    	    waitKey(0);
    	    return 0;
    	}
    

    2.2 缩放比率

    	//图片的缩小与放大
    	int main()
    	{
    	    Mat img = imread("D:/test/1.jpg");
    	    imshow("原始图", img);
    	 
    	    Mat dst;
    	    resize(img, dst, Size(),0.25,0.25);//长宽都变为img的0.25倍
    	    
    	    imshow("尺寸调整之后", dst);
    	    waitKey(0);
    	    return 0;
    	}
    

    在这里插入图片描述

    二、图像金字塔

    1. 概念

    图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。

    一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低

    说白了就是图像的缩放

    一张图像不断的缩小,大图在下,小图在上,看起来就是一个金字塔。例如下面的苹果:
    在这里插入图片描述


    2. 图像金字塔的原理

    2.1 图像的缩小

    先进行高斯模糊,再降采样,需要一次次的重复,不能一次到底。

    2.2 图像的扩大

    先进行图像扩大,在进行卷积或者使用拉普拉斯金字塔





    3. 金字塔上采样和下采样

    OpenCV中有关图像金字塔的操作有pyrup()和pyrdown(),分别用于完成上采样和下采样。

    3.1 下采样pyrDown()

    实质就是缩小图像。
    pyrDown是一个会丢失信息的函数

    • 说明
      模糊一个图像,并下缩小图像尺寸。
      通常情况下,输出图像的尺寸由“Size((src.cols+1)/2,(src.rows+1)/2)”计算出。但是无论如何都应满足以下条件:
      {dstsize.width2src.cols2dstsize.height2src.rows2\left \{ \begin{array}{l} | \texttt{dstsize.width} *2-src.cols| \leq 2 \\ | \texttt{dstsize.height} *2-src.rows| \leq 2 \end{array} \right.

    • 步骤

      1. 该函数执行高斯金字塔构造的下采样,先对图像进行高斯内核卷积:
        1256[1464141624164624362464162416414641]\frac{1}{256} \begin{bmatrix} 1 & 4 & 6 & 4 & 1 \\ 4 & 16 & 24 & 16 & 4 \\ 6 & 24 & 36 & 24 & 6 \\ 4 & 16 & 24 & 16 & 4 \\ 1 & 4 & 6 & 4 & 1 \end{bmatrix}
        2. 再将所有偶数行和列去除。
    • 声明

      void pyrDown( 
          InputArray src, 
          OutputArray dst,
          const Size& dstsize = Size(), 
          int borderType = BORDER_DEFAULT 
          );
      
    • 参数

      src 输入图像
      dst 输出图像,它和原图有相同的类型,但是有特定的尺寸。
      dstsize 输出图像的尺寸。
      borderType 边界填充的类型。BORDER_CONSTANT isn’t supported
    • 举例

      void downSizes(Mat src) {
      	Mat dst;
      	src.copyTo(dst);
      	for ( int i = 0; i <3; i++)
      	{
      		pyrDown(dst, dst);
      		string name = "dst_" + to_string(i);
      		imshow(name, dst);
      	}
      }
      int main() {
      
      	Mat src = imread("D:/test/src.jpg");
      	imshow("src", src);
      
      	downSizes(src);
      	
      	waitKey(0);
      	return 0;
      }
      

      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    3.2 上采样pyrUp()

    实质就是放大图像。

    • 说明
      下采样图像并模糊它。

      通常情况下,输出图像的尺寸由Size(src.cols2,src.rows2)计算出来,但是无论如何都应满足以下条件:
      {dstsize.widthsrc.cols2(dstsize.widthmod  2)dstsize.heightsrc.rows2(dstsize.heightmod  2)} \left \{ \begin{array}{l} | \texttt{dstsize.width} -src.cols*2| \leq ( \texttt{dstsize.width} \mod 2) \\ | \texttt{dstsize.height} -src.rows*2| \leq ( \texttt{dstsize.height} \mod 2) \end{array} \right \}
      该函数执行高斯金字塔结构的上采样,尽管实际上可以用于构造拉普拉斯金字塔。

    • 步骤:

      1.先将图像在每个方向放大为原来的两倍,
      2. 新增的行和列用0填充,
      3. 将结果与pyrDown中相同的内核乘以4进行卷积,获得新增像素的近似值。

    • 声明

      void pyrUp( 
             InputArray src,
             OutputArray dst,
             const Size& dstsize = Size(), 
             int borderType = BORDER_DEFAULT 
      );
      
    • 参数

      src 输入图像
      dst 输出图像。它具有指定的大小,并且与src具有相同的类型。
      dstsize 指定输出图像的尺寸。
    • 举例应用

      void upSize(Mat src) {
      	Mat dst = src.clone();
      	for (int i = 0; i < 3; i++)
      	{
      		pyrUp(dst, dst);
      		string name = "Dst_" + to_string(i);
      		imshow(name, dst);
      	}
      }
      
      
      int main() {
      
      	Mat src = imread("D:/test/src912.jpg");
      	imshow("src", src);
      	upSize(src);
      	waitKey(0);
      	return 0;
      }
      

      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    4. 图像金字塔分类

    图像金字塔分为两类:高斯图像金字塔拉普拉斯图像金字塔
    在这里插入图片描述

    4.1 高斯图像金字塔

    用于向下采样,主要的图像金字塔。

    高斯金字塔通过高斯平滑和亚采样获得一系列下采样图像,也就是第k层高斯金字塔通过平滑、亚采样就可以获得第k+1层高斯图像,高斯金字塔包含一系列低通滤波器,其截至频率从上一层到下一层是以因子2逐渐增加,所以高斯金字塔可以跨越很大的频率范围。

    • 高斯金字塔图像:
      每一层都按照从下到上的次序编号,层级Gi+1G_{i+1}(表示为Gi+1G_{i+1}尺寸小于第i层GiG_i)。
      在这里插入图片描述
    • 对图像的向下取样
      为了获取层级为Gi+1G_{i+1}的金字塔图像,采用如下方法:
      1)对图像GiG_i进行高斯内核卷积
      2)将所有偶数行和列去除

    📢📢📢 向下取样会逐渐丢失图像的信息。

    4.2 拉普拉斯图像金字塔

    用来从金字塔底层图像重建上层采样图像,在数组图像处理中也即是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。

    拉普拉斯金字塔中的图像可用于对高斯金字塔中相邻的两层图像的相减而近似得到。

    需要先将图像在较粗的尺度上扩展。
    在这里插入图片描述

    我们选用的图片大小必须是2^n大小,或者是一个宽高相等的图片

    • 对图像的向上取样在这里插入图片描述

    • 拉普拉斯应用

          Mat src = imread("D:/test/src.jpg");
      	imshow("src", src);
      	Mat upImg,downImg,dst;
      	pyrDown(src, downImg);
      	pyrUp(downImg, upImg);
      	cout << "src:(" << src.rows << "," << src.cols << ") " << src.channels() << endl;
      	cout << "downImg:(" << downImg.rows << "," << downImg.cols << ") " << downImg.channels() << endl;
      	cout << "upImg:(" << upImg.rows <<","<< upImg.cols << ") " << upImg.channels() << endl;
      
      
      	subtract(src, upImg, dst);
      	cout << "dst:(" <<dst.rows << "," <<dst.cols << ") " << dst.channels() << endl;
      
          imshow("upimg", upImg);
          imshow("dst", dst);
      
      	waitKey(0);
      	
      

      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      学习:

    高斯金字塔、拉普拉斯金字塔
    图像金字塔, 高斯金字塔, 拉普拉斯金字塔
    Opencv进阶篇—图像金字塔
    怎么认识图像金字塔
    图像金字塔
    OpenCV—图像金字塔原理

    展开全文
  • 新人学习opencv图像处理的笔记,二:c++操作简单的图像缩小和边缘检测思路 图像缩小的两种思路 一:间隔取样 这种思路读者也没想到,是看网友的博客才知道的。间隔取样的基本操作就是通过计算,有选择地、间隔地在...

    新人学习opencv图像处理的笔记,二:c++操作简单的图像缩小和边缘检测思路

    图像缩小的两种思路

    一:间隔取样

    这种思路笔者也没想到,是看网友的博客才知道的。间隔取样的基本操作就是通过计算,有选择地、等间隔地在原图中选择像素,放入新图中。

    这种方法在宏观上来看,好像没什么毛病。毕竟图像的缩小在我们肉眼中,就是在原图的基础上去删减像素点,从而实现图像的缩小。但是仔细思考,这种方法会造成图像的特征丢失
    在这里插入图片描述
    在原图像素与缩小比例满足一定关系时,确实间隔取样是个不错的方法,毕竟算法简单,计算量小。从上图来看,等间隔1取样,确实完美做到了缩小的关系。可是下图呢?
    在这里插入图片描述
    上图(视为精密排列的像素点)中的两种取样都不合适。如果取红色,那么黑色点作为特征点丢失了,取黑色也一样。所以间隔取样的方法要慎用,计算简单的代价可能是图的失真。

    二:通过局部取样的图像缩小

    上学期笔者感兴趣CNN,查卷积池化时想到的一种方法。

    首先,我们需要定义一个核K,用于提取局部的像素值,然后需要确定滑动步长S(笔者建议滑动步长S的大小要小于K的大小,不然就重新回到了间隔取样的问题,特征丢失),这里笔者自己推了一个公式,可供参考:
    在这里插入图片描述

    其中MN是指原图的行列数,mn是缩小倍数后的行列数,S是滑动步长,K是核大小。这个公式里只有两个未知数,S和K。为了避免变形为间隔取样,笔者的思路是先确定滑动步长S,然后根据滑动步长来算核K的大小。笔者把K设成了一个未确定大小的方阵,具体K是个什么样的矩阵还要看情况。其次,滑动步长S分成x和y方向,两个方向的值可以相同,可以不同,这就取决于操作者了。

    确定了需要的参数后,我们的工作就只剩下算值和赋值了。步骤如下
    在这里插入图片描述

    假设K的大小是2x2,S的大小是2。如上图所示,先将K放入原图中的第一个区域(左上角的块),使用均值的方法((P1+P2+P3+P4)/4),也可以用不同权重取处理四个点,将4个Pixel的平均值作为得到的像素点,放入新图的对应点处。然后按滑动步长的大小依次向左下移动核,按照上述方法求像素。

    笔者想的这种方法相比于间隔取样而言,计算量大,操作性不高,而且也不是完全不失真。比如得事先在函数中设置S的大小,然后让计算机算K的大小,然而K如果过大,操作过后的图像会出现模糊,也会丢失某些特征点或者说是特征点被掩盖了。

    这个是笔者的结果图:
    在这里插入图片描述

    边缘检测的两种思路

    第一种:Canny

    边缘检测现在opencv用的是canny算子,最主要的算法。是根据四个方向(横竖两对角)的梯度来算的。当梯度出现零点时,代表导数不变,这个不变点就可视为一个边缘点。Canny算子需要的数学知识有点多,笔者也没弄清楚,所以要想知道详情,请参看下方其他作者博客
    Canny边缘检测算子详情

    第二种:基于Canny的简化版

    笔者的思路和Canny算子的核心差不多,都是找像素断层点。不过笔者确实没那么高的水平,没想到用梯度的方法,而是取周围八个相邻区域的像素点值,做差比较。这个方法比较适合和笔者一样c++水平有限,高数有限的入门新手试试。

    同上文中的缩小算法一样,先定义一个核K大小3x3,然后确定步长S(因为是原图检测,不需要放缩,这里就直接定为1了)。OK,准备工作搞定了,那么就开始简化吧,同样的选取一个点,以这个点为中心,做一个K,包起来,按照自己需要的权重算出来这个K的值。
    ---------------------------------用核的原因是减少噪声的干扰。
    在这里插入图片描述
    如图得到K后,分别以周围8个点中心(图中只标出了以四个顶点为中心的K),分别得到:K0,K1,K2,K3,K4,K5,K6,K7。用这8个值与K做差且做绝对值处理。得到八个值。我们需要用这8个值来与一个标准C进行比较,这个C由我们自己决定,笔者想法中,C代表像素变化的上界,当八个值都小于C时,表示在操作者眼中变化平滑,所以不是边缘,反之则是边缘点,给边缘点打上标记就行了。由此完成了终极简化版检测。
    注意:其实上述思路是有问题的,变化平滑与否,终究是取决于梯度,客观表现在导数,而不是直观的像素做差,这里是笔者的一个脑洞算法,只能用一些简单,色差大,轮廓明显的图像。如下是笔者在两种不同图上的效果
    第一张,效果还不错,O(∩_∩)O
    在这里插入图片描述
    第二张,简直就是见鬼了在这里插入图片描述

    总上边缘检测的算法还是得用到数值计算去找函数,用梯度算法找,笔者的算法只能是一种兴趣。加油吧。

    笔者水平有限,若有错误,敬请指正。总之,还是感谢大家看了我的博客。O(∩_∩)O!

    展开全文
  • 图像的大小可以手动指定,也可以使用缩放比例。cv2.resize()支持多种插值算法,默认使用的是cv2.INTER_LINEAR(不管放大和缩小)。缩小最适合使用:cv2.INTER_AREA,放大最适合使用:cv2.INTER_CUBIC (慢) 或 cv2....
  • 这里写的缩小和方法都是等比例进行的,不是等比例的改也比较简单,这里就不改了,有兴趣的朋友可以自己尝试着改改,另外这里用的是灰度图,彩色图稍微改改就行了 比例缩小 ratio 是缩小比例,大致思路是: 1、先根据...
  • opencv相机标定

    2016-09-05 22:24:13
    代码是我几个月前,不知道哪里下载的,原始版权不在我,...我做了小修改,就是把图片先缩小找到角点了,再放大到原来比例。 输入参数: 方格的数量,注意是内圈角点数量 boardsize 方格的物理 尺寸,单位毫米 ...
  • OpenCV: 图片的缩放

    千次阅读 2019-06-04 23:26:09
    我们将其等比例缩小至原来的四分之一 import cv2 img = cv2.imread('test.png',1) imgInfo = img.shape print(imgInfo) 打印结果可以看到,图片大小为700*700像素 然后我们使用resize()函数对该图片,进行等比例的...
  • 图像的几何变换 ... 一、缩放变换 缩放就是改变图像的...图像的大小可以手动指定,也可以使用缩放比例。 cv2.resize()支持多种插值算法,默认使用的是cv2.INTER_LINEAR(不管放大和缩小)。 缩小最适合使用:cv2.I...
  • #1 load 2 info 3 resize 4 check import cv2 img = cv2.imread('bucky.jpg',1) imgInfo = img.shape print(imgInfo) height = imgInfo[0] width = imgInfo[1] ...#1 放大 缩小 2等比例 非 dstHeight = in...
  • openCV对比图片库找到最匹配图片

    千次阅读 2018-04-20 08:11:39
    这一步的作用是去除图像的细节,只保留结构/明暗基本信息,摒弃不同尺寸/比例带来的图像差异;简化色彩:将缩小后的图像,转为64级灰度,即所有像素点总共只有64种颜色;计算平均值:计算所有64个像素的灰度平均值...
  • 这一步的作用是去除图像的细节,只保留结构/明暗基本信息,摒弃不同尺寸/比例带来的图像差异; 简化色彩:将缩小后的图像,转为64级灰度,即所有像素点总共只有64种颜色; 计算平均值:计算所有64个像素的灰度平均...
  •  感知哈希算法(perceptual hash algorithm),它的作用是对每张图像生成一个“指纹”(fingerprint)字符串...这一步的作用是去除图像的细节,只保留结构/明暗基本信息,摒弃不同尺寸/比例带来的图像差异; 2. 简
  • 图片缩放 图片放在上一级文件夹则: img = cv2.imread('../image0.jpg',1) # 1 load 2 info 3 resize 4 check import cv2 img = cv2.imread('image0.jpg',1) ...# 1 放大 缩小 2 等比例 非 2:3 d...
  • 本篇笔记的运行环境为:windows下配置好opencv3.1.0和tensorflow1.2.1环境的python3.5.4编辑器pycharm。(ps:没用到tensorflow所以可以忽略) ...根据图片缩放的比例,可以分为等比例和非等比例...
  • 图像变换

    2019-03-15 14:07:46
    OpenCV-Python:图像的几何变换(平移、旋转、仿射变换) 缩放变换 缩放就是改变图像的大小,使用cv2.resize()函数。图像的大小可以手动指定,也可以使用缩放比例。cv2.resize()支持多种插值算法,默认使用的是...
  • 上周,正在忙,突然有个同学找我帮忙,说有个需求:图片相似度比较。...这一步的作用是去除图像的细节,只保留结构/明暗基本信息,摒弃不同尺寸/比例带来的图像差异; 注:实际操作时,采取了...

空空如也

空空如也

1 2
收藏数 28
精华内容 11
关键字:

opencv等比例缩小