最近在复习图像算法,对于一些简单的图像算法进行一个代码实现,由于找工作比较忙,具体原理后期补上,先上代码。今天先给出最近邻插值,双线性插值,三次插值。
1.最近邻插值
原始图中影响点数为1
(1)代码

# include<iostream>
# include<opencv2/highgui/highgui.hpp>using namespace std;
using namespace cv;Mat NearInter(Mat &srcImage, double kx, double ky)
{int rows = cvRound(srcImage.rows*kx);int cols = cvRound(srcImage.cols*ky);Mat resultImg(rows, cols, srcImage.type());int i, j, x, y;for (i = 0; i < rows; i++){x = static_cast<int>((i + 1) / kx + 0.5) - 1;for (j = 0; j < cols; j++){y = static_cast<int>((j + 1) / ky + 0.5) - 1;resultImg.at<Vec3b>(i, j) = srcImage.at<Vec3b>(x, y);}}return resultImg;
}int main()
{Mat srcImg = imread("D:\\Visual Studio 2015\\lena.bmp");Mat resultImg = NearInter(srcImg, 0.6, 1.2);imshow("src", srcImg);imshow("0.6,1.2", resultImg);waitKey(0);return 0;
}

(2)结果:

2.线性插值
与原图中相关的点数为4
(1)代码

# include<iostream>
# include<opencv2/highgui/highgui.hpp>using namespace cv;Mat LinerInter(Mat &srcImage, double kx, double ky);int main()
{Mat srcImg = imread("D:\\Visual Studio 2015\\lena.bmp");Mat resultImg = LinerInter(srcImg, 0.6, 1.2);imshow("src", srcImg);imshow("0.6, 1.2", resultImg);waitKey(0);return 0;
}Mat LinerInter(Mat &srcImage, double kx, double ky)
{int rows = cvRound(srcImage.rows*kx);int cols = cvRound(srcImage.cols*ky);Mat resultImg(rows, cols, srcImage.type());int i, j;int xi;int yi;int x11;int y11;double xm;double ym;double dx;double dy;for (i = 0; i < rows; i++){xm = i / kx;xi = (int)xm;x11 = xi + 1;dx = xm - xi;for (j = 0; j < cols; j++){ym = j / ky;yi = (int)ym;y11 = yi + 1;dy = ym - yi;//判断边界if (x11 >(srcImage.rows - 1)){x11 = xi - 1;}if (y11 > (srcImage.cols - 1)){y11 = yi - 1;}//bgrresultImg.at<Vec3b>(i, j)[0] = (int)(srcImage.at<Vec3b>(xi, yi)[0] * (1 - dx)*(1 - dy)+ srcImage.at<Vec3b>(x11, yi)[0] * dx*(1 - dy)+ srcImage.at<Vec3b>(xi, y11)[0] * (1 - dx)*dy+ srcImage.at<Vec3b>(x11, y11)[0] * dx*dy);resultImg.at<Vec3b>(i, j)[1] = (int)(srcImage.at<Vec3b>(xi, yi)[1] * (1 - dx)*(1 - dy)+ srcImage.at<Vec3b>(x11, yi)[1] * dx*(1 - dy)+ srcImage.at<Vec3b>(xi, y11)[1] * (1 - dx)*dy+ srcImage.at<Vec3b>(x11, y11)[1] * dx*dy);resultImg.at<Vec3b>(i, j)[2] = (int)(srcImage.at<Vec3b>(xi, yi)[2] * (1 - dx)*(1 - dy)+ srcImage.at<Vec3b>(x11, yi)[2] * dx*(1 - dy)+ srcImage.at<Vec3b>(xi, y11)[2] * (1 - dx)*dy+ srcImage.at<Vec3b>(x11, y11)[2] * dx*dy);}}return resultImg;
}

(2)结果:

3.三次插值
基于bicubic函数的权值计算,取a = -0.5

与原图相关的点数为16
(1)代码

# include<iostream>
# include<cmath>
# include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;float Bicubic(float x);
Mat ThreeInter(Mat &srcImage, double kx, double ky);int main()
{Mat srcImg = imread("D:\\Visual Studio 2015\\lena.bmp");if (!srcImg.data){cout << "图片不存在" << endl;}Mat resultImg = ThreeInter(srcImg, 0.6, 1.2);imshow("src", srcImg);imshow("0.6,1.2", resultImg);waitKey(0);return 0;
}float Bicubic(float y)
{float x = abs(y);float a = -0.5;if (x <= 1.0){return (a + 2)*pow(x, 3) - (a + 3)*pow(x, 2) + 1;}else if (x < 2.0){return a*pow(x, 3) + 5 * a*pow(x, 2) - 4 * a;}else{return 0.0;}
}Mat ThreeInter(Mat &srcImage, double kx, double ky)
{int rows = cvRound(srcImage.rows * kx);int cols = cvRound(srcImage.cols * ky);Mat resultImg(rows, cols, srcImage.type());int i, j;int xm, ym;int x0, y0, xi, yi, x1, y1, x2, y2;float wx0, wy0, wxi, wyi, wx1, wy1, wx2, wy2;float w00, w01, w02, w0i, w10, w11, w12, w1i, w20, w21, w22, w2i, wi0, wi1, wi2, wii;for (i = 0; i < rows; i++){xm = i / kx;xi = (int)xm;x0 = xi - 1;x1 = xi + 1;x2 = xi + 2;wx0 = Bicubic(x0 - xm);wxi = Bicubic(xi - xm);wx1 = Bicubic(x1 - xm);wx2 = Bicubic(x2 - xm);for (j = 0; j < cols; j++){ym = j / ky;yi = (int)ym;y0 = yi - 1;y1 = yi + 1;y2 = yi + 2;wy0 = Bicubic(y0 - ym);wyi = Bicubic(yi - ym);wy1 = Bicubic(y1 - ym);wy2 = Bicubic(y2 - ym);w00 = wx0*wy0;w01 = wx0*wy1;w02 = wx0*wy2;w0i = wx0*wyi;w10 = wx1*wy0;w11 = wx1*wy1;w12 = wx1*wy2;w1i = wx1*wyi;w20 = wx2*wy0;w21 = wx2*wy1;w22 = wx2*wy2;w2i = wx2*wyi;wi0 = wxi*wy0;wi1 = wxi*wy1;wi2 = wxi*wy2;wii = wxi*wyi;if ((x0 >= 0) && (x2 < srcImage.rows) && (y0 >= 0) && (y2 < srcImage.cols)){resultImg.at<Vec3b>(i, j) = (srcImage.at<Vec3b>(x0, y0)*w00 + srcImage.at<Vec3b>(x0, y1)*w01 + srcImage.at<Vec3b>(x0, y2)*w02 + srcImage.at<Vec3b>(x0, yi)*w0i+ srcImage.at<Vec3b>(x1, y0)*w10 + srcImage.at<Vec3b>(x1, y1)*w11 + srcImage.at<Vec3b>(x1, y2)*w12 + srcImage.at<Vec3b>(x1, yi)*w1i+ srcImage.at<Vec3b>(x2, y0)*w20 + srcImage.at<Vec3b>(x2, y1)*w21 + srcImage.at<Vec3b>(x2, y2)*w22 + srcImage.at<Vec3b>(x2, yi)*w2i+ srcImage.at<Vec3b>(xi, y0)*wi0 + srcImage.at<Vec3b>(xi, y1)*wi1 + srcImage.at<Vec3b>(xi, y2)*wi2 + srcImage.at<Vec3b>(xi, yi)*wii);}}}return resultImg;
}

(2)结果

推荐参考博客:https://me.csdn.net/linqianbi

图像算法(一):最近邻插值,双线性插值,三次插值相关推荐

  1. 数字图像缩放之最近邻插值与双线性插值处理效果对比

    基本原理: 1.最近邻插值:变换后的目标图像某点像素值等于源图像中与变换前相应点最近的点的像素值.具体操作为,设水平方向和垂直方向缩放的比例分别为w和h,那么目标图像中的点des(x,y)对应的源图像 ...

  2. 最近邻插值、双线性插值、双三次插值

    1.最近邻插值 越是简单的模型越适合用来举例子,我们就举个简单的图像:3X3 的256级灰度图,也就是高为3个象素,宽也是3个象素的图像,每个象素的取值可以是 0-255,代表该像素的亮度,255代表 ...

  3. 图像插值算法:最近邻插值、双线性插值

    插值算法:最近邻插值.双线性插值 文章目录 插值算法:最近邻插值.双线性插值 最近邻插值法(nearest_neighbor) 线性插值 单线性插值法 双线性插值 插值算法有很多种,这里列出关联比较密 ...

  4. 最近邻插值与双线性插值

    最近邻插值 顾名思义,最近邻插值法在放大图像时补充的像素是最近邻的像素的值.由于方法简单,所以处理速度很快,但是得到的图像常常含有锯齿边缘.如下图所示: import cv2 import numpy ...

  5. 【opencv】最近邻插值、双线性插值、双三次插值(三次样条插值)

    目录 1. 最近邻插值 2. 双线性插值 1)简单理解 2)一般性 3. 双三次插值(三次样条插值) 总结 1. 最近邻插值 举个简单例子:一个3×33 \times 33×3 的单通道图像,如下 如 ...

  6. CV笔记2:图像插值算法—最近邻插值、双线性插值

    目录 一. 简介 二.最近邻插值 三.双线性插值 3.1 线性插值 3.2 双线性插值 3.3 双线性插值的加速及优化策略 参考 一. 简介 在图像处理中,平移变换.旋转变换以及放缩变换是一些基础且常 ...

  7. CImage实现双缓冲最近邻插值

     一普通显示:现在的VC显示图片非常方便,远不是VC6.0那个年代的技术可比,而且支持多种格式的如JPG,PNG. CImage _img; 初始化: _img.Load(L"map.p ...

  8. 最近邻插值实现:图像任意尺寸变换

    #<opencv2/imgproc/imgproc.hpp> #include <opencv2/core/core.hpp> #include <opencv2/hig ...

  9. 数字图像处理笔记二 - 图片缩放(最近邻插值(Nearest Neighbor interpolation))

    图片缩放的两种常见算法: 最近邻域内插法(Nearest Neighbor interpolation) 双向性内插法(bilinear interpolation) 本文主要讲述最近邻插值(Near ...

  10. 【图像处理】图像内插“最近邻插值 最近邻内插法(Nearest Neighbour Interpolate)”代码演示(调整图像大小、放大、缩小)

    文章目录 何为内插--最近邻插值,引用自<数字图像处理--第三版> 代码演示 1.设置缩放倍数来放大.缩小图像 2.设置图片最终分辨率来放大.缩小图像 代码中使用的源图 20200625 ...

最新文章

  1. 【C 语言】字符串模型 ( strstr-while 模型 | 抽象函数模型 | 业务子函数接口定义要点 | 形参指针间接赋值 | 返回值状态 | 形参指针处理 | 形参指针判空 | 形参返回值 )
  2. 45、Power Query-缺少功能区选项卡
  3. session和cookie到底有什么联系?这一篇文章给你分析的明明白白~
  4. Median String
  5. JSF2.0与纯JS框架
  6. MapReduce的简单实例WordCount
  7. A small tip to explore how to call a method of a control
  8. mvn deploy 推送到私有仓库,注意当前日期
  9. 自定义报表预览控制工具条
  10. Php面试题之背人过桥,梦见背人过桥好不好?
  11. 凝思系统如何调节分辨率_如何消除步进电机的噪音和振动?
  12. C3P0组件+DbUtils组件实现一个JdbcUtils工具类
  13. JAVA Web基础3-Servlet
  14. [转载] 3 idiots
  15. Morris 中序遍历
  16. 使用 HttpWatch 分析 HTTP 协议
  17. mysql server has gone away_mysql server has gone away的解决方法
  18. 大数据基础知识之什么是服务器什么是集群
  19. 基于Springboot+mybatis+mysql+html实现CRM智能办公系统
  20. activerecords php,ActiveRecord_帮助文档_Thinkphp手册 | 码农网

热门文章

  1. linux上挂载iso文件,如何在Linux上挂载ISO文件
  2. IT 工作中常用的英语单词
  3. 银行会计学3(特点、核算的前提假设、对象和标准)
  4. CVE-2020-1938 /CNVD-2020-10487漏洞调试
  5. 如何在本地运行travis-ci
  6. Android-AhMyth Rat
  7. OH!硬件!—— 开源硬件平台OSHWHub介绍
  8. oracle现金流量表逻辑,【实战】编制现金流量表的一些个人理解(附下载勾稽表)...
  9. 美团校园招聘笔试例题一---C语言
  10. 2018华东师范软件复试机试