图像的放大本质上就是增加像素点,目前常用的传统方法是内插法,代表算法有最临近点插值算法、双线性插值算法和双三次插值法,这些算法都是基于相邻像素点的像素值计算所要增加的像素点的像素值,因而在放大时会有失真的现象存在。在深度学习领域,图像的方法也称为超分辨率,一般采用Gan网络对抗生成高分辨率图片,尽管在一些数据集中取得不错的表现,但是算法的鲁棒性还有待加强。因此,了解传统的内插法还是有很大必要的。

最临近点插值算法

这是最简单的一种插值方法,在所求象素的相邻(上下左右)象素中,将距离待求象素最近的邻象素灰度赋给待求象素。设i+u, j+v(i, j为正整数, u, v为大于零小于1的小数,下同)为待求象素坐标,则待求象素灰度的值为f(n(i+u),n( j+v)) ,其中n为最近的一个像素。

优点:简单、计算量小。
缺点:效果不好,图像放大后失真现象严重。

双线性插值算法

双线性内插法是利用待求像素四个相邻像素的灰度,按照其距内插点的距离赋予不同的权重,进行线性内插,如下图所示:

从图中看出,f(x,y)为所求的像素值,其相邻点为图中红点所示分别为f(i,j),f(i+1,j),f(i,j+1),f(i+1,j+1),其像素值如图中绿色线条所示,长度代表值的大小。通过f(x,y)与4点的距离比例,再分别乘以4点的像素值,可以得到所求像素点的值,如图中蓝色线条所示。
优点:图像连续性较好,是目前最常用的内插法。
缺点:放大时图像较为模糊,细节损失较严重。
代码如下:
"bmp.h"的头文件代码: bmp图片的类以及读写函数 bmp.h

#include <iostream>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <malloc.h>
#include <cstdio>
#include "bmp.h"
using namespace std;
#define DRAW_HEIGHT 512  //目标图像高度
#define DRAW_WIDTH 512  //目标图像宽度  int main()
{ BMP rbmp;BMP wbmp(DRAW_WIDTH,DRAW_HEIGHT);char strFile[50] = "./lena24.bmp";//打开图像路径,BMP图像必须为24位真彩色格式  char strFilesave[50] = "./test.bmp";//处理后图像存储路径 //读取位图的数据 imread(strFile,rbmp);int width = rbmp.cols();int height = rbmp.rows(); int l_width = WIDTHBYTES(width*24);//计算位图的实际宽度并确保它为4byte的倍数  //写位图的数据int write_width = WIDTHBYTES(DRAW_WIDTH*24);//计算写位图的实际宽度(字节)并确保它为4byte的倍数   /*******************图像处理部分******************/for (int hnum = 0; hnum < DRAW_HEIGHT; hnum++){for (int wnum = 0; wnum < DRAW_WIDTH; wnum++){double d_original_img_hnum = hnum*height / (double)DRAW_HEIGHT;double d_original_img_wnum = wnum*width / (double)DRAW_WIDTH;int i_original_img_hnum = d_original_img_hnum;int i_original_img_wnum = d_original_img_wnum;double distance_to_a_x = d_original_img_wnum - i_original_img_wnum;//在原图像中与a点的水平距离  double distance_to_a_y = d_original_img_hnum - i_original_img_hnum;//在原图像中与a点的垂直距离  int original_point_a = i_original_img_hnum*l_width + i_original_img_wnum * 3;//数组位置偏移量,对应于图像的各像素点RGB的起点,相当于点A    int original_point_b = i_original_img_hnum*l_width + (i_original_img_wnum + 1) * 3;//数组位置偏移量,对应于图像的各像素点RGB的起点,相当于点B  int original_point_c = (i_original_img_hnum + 1)*l_width + i_original_img_wnum * 3;//数组位置偏移量,对应于图像的各像素点RGB的起点,相当于点C   int original_point_d = (i_original_img_hnum + 1)*l_width + (i_original_img_wnum + 1) * 3;//数组位置偏移量,对应于图像的各像素点RGB的起点,相当于点D   if (i_original_img_hnum +1== DRAW_HEIGHT - 1){original_point_c = original_point_a;original_point_d = original_point_b;}if (i_original_img_wnum +1== DRAW_WIDTH - 1){original_point_b = original_point_a;original_point_d = original_point_c;}                              int pixel_point = hnum*write_width + wnum * 3;//映射尺度变换图像数组位置偏移量  wbmp.pColorData[pixel_point] =rbmp.pColorData[original_point_a] * (1 - distance_to_a_x)*(1 - distance_to_a_y) +rbmp.pColorData[original_point_b] * distance_to_a_x*(1 - distance_to_a_y) +rbmp.pColorData[original_point_c] * distance_to_a_y*(1 - distance_to_a_x) +rbmp.pColorData[original_point_d] * distance_to_a_y*distance_to_a_x;wbmp.pColorData[pixel_point + 1] =rbmp.pColorData[original_point_a + 1] * (1 - distance_to_a_x)*(1 - distance_to_a_y) +rbmp.pColorData[original_point_b + 1] * distance_to_a_x*(1 - distance_to_a_y) +rbmp.pColorData[original_point_c + 1] * distance_to_a_y*(1 - distance_to_a_x) +rbmp.pColorData[original_point_d + 1] * distance_to_a_y*distance_to_a_x;wbmp.pColorData[pixel_point + 2] =rbmp.pColorData[original_point_a + 2] * (1 - distance_to_a_x)*(1 - distance_to_a_y) +rbmp.pColorData[original_point_b + 2] * distance_to_a_x*(1 - distance_to_a_y) +rbmp.pColorData[original_point_c + 2] * distance_to_a_y*(1 - distance_to_a_x) +rbmp.pColorData[original_point_d + 2] * distance_to_a_y*distance_to_a_x;}}/*******************图像处理部分******************/std::cout<<"Done!"<<std::endl;imwrite(strFilesave,wbmp); system("pause"); return 0;
}

效果图:

双三次插值法

这个算法原理比较复杂,我另开一章记录,连接如下:
图像的放大:双三次插值算法(C++实现)

opencv实现

opencv自带的resize()函数已经实现了以上算法,仅需要一行代码即可完成。

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

前两个参数分别为输入和输出图像,dsize表示输出图像的大小,fx、fy是沿x轴和y轴的缩放系数。

dsize=Size(round(fx∗src.cols),round(fy∗src.rows))
dsize和fx、fy不能同时为0。fx、fy是沿x轴和y轴的缩放系数;默认取0时,计算如下
其中的参数interpolation表示插值方式,有以下几种:
INTER_NEAREST - 最近邻插值
INTER_LINEAR - 线性插值(默认)
INTER_AREA - 区域插值
INTER_CUBIC - 三次样条插值
INTER_LANCZOS4 - Lanczos插值

图像的放大:双线性插值算法(C++实现)相关推荐

  1. 数字图像处理(十三)图像放大及双线性插值算法

    导言 图像放大是日常学习中经常要用到的两个算法,我们首先讨论缩放的流程以及放大时如何优化双线性插值算法. 采用国际标准测试图像Lena,为了方便,我们将读入的彩色图转为灰度图进行缩放. 图像放大 和图 ...

  2. 图像缩放的双线性内插值算法的原理解析

    转自:http://blog.csdn.net/qiqi5521/article/details/2207562 图像的缩放很好理解,就是图像的放大和缩小.传统的绘画工具中,有一种叫做"放大 ...

  3. 视频图像处理基础知识0(双线性插值算法进行图像缩放)【转】

    转自:http://blog.csdn.net/times_poem/article/details/51395781 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 双线性插 ...

  4. bmp 双线性插值_基于双线性插值算法的图像放缩技术与实现_冯慧君

    九江 332000) 2 ( 闽发证券有限责任公司 上海 200031) 3 ( 华为技术有限公司 上海 200121) 摘 要 本文介绍了双线性插值算法在图像放缩领域的应用和具体实现的方法 , 并通 ...

  5. python皮同_Python OpenCV 图像的双线性插值算法,全网最细致的算法说明_橡皮擦,一个逗趣的互联网高级网虫-CSDN博客...

    原文作者:梦想橡皮擦 原文标题:Python OpenCV 图像的双线性插值算法,全网最细致的算法说明 发布时间:2021-02-17 20:55:32 Python OpenCV 365 天学习计划 ...

  6. (转)最临近插值-双线性插值算法原理

    转自连接http://blog.163.com/guohuanhuan_cool@126/blog/static/167614238201161525538402/ 图 像的缩放很好理解,就是图像的放 ...

  7. 双线性插值算法实现和opencv、matlab结果不一致问题

    最近在编程时用到了双线性插值算法,对图像进行缩放.网上有很多这方面的资料,介绍的也算明白.但是,这些文章只介绍了算法,并没有具体说怎么实现以及怎么实现最好,举个例子,你可以按照网上文章的算法自己写一个 ...

  8. java 图片放大缩小_java 图像的放大与缩小

    图像的放大,需要补充没有的像素,常用的方法有 1.最临近点插值算法(Nearest Neighbor) 2.双线性插值算法(Bilinear Interpolation) 3.双立方插值算法(Bicu ...

  9. 图像的放大与缩小(2)——双线性插值放大与均值缩小

    2019独角兽企业重金招聘Python工程师标准>>> 概述 基于上一节"等距采样法"实现图片放大与缩小的缺点.要对其进行改进,对图像的缩小则可以用"局 ...

最新文章

  1. 理解和实现分布式TensorFlow集群完整教程
  2. php中perl配置,配置Apache及运行perl,php
  3. msbuild 语法_用于删除文件的MSBuild Task语法
  4. 重载和引用函数编程实验
  5. 计算机基础- -应用和硬件的关系
  6. CodeForces - 616D Longest k-Good Segment
  7. Cocos2d-3.x Android环境搭建
  8. No space left on device 磁盘空间提示不足解决办法
  9. 【数据结构课设】家谱管理系统(内附源码)
  10. 用二分法求下面方程在(-10,10)之间的根:2x^3-4x^2+3x-6=0
  11. 计算机鼠标不动了,计算机鼠标不动了怎么解决?
  12. 文科生也能看懂,什么是熵
  13. 2011考研数学二第(20)题——积分应用:旋转体的体积
  14. java程序员面试题之32问
  15. dcoker常用命令
  16. 在element ui中如何自定义el-date-picker的宽度 笔记
  17. “数据结构”课程设计题目
  18. w3school SQL教程整理
  19. VS“无法查找或打开PDB文件”是怎么回事?如何解决
  20. web服务器:SOAP,WSDL,UDDI

热门文章

  1. 网络安全:对于小白白的学习建议以及自己的学习计划
  2. 使用Tushare进行金融时间序列分析研究
  3. 干货分享—Eclipse 的使用配置整理
  4. 一个完整的程序化交易系统包含了哪些因素?
  5. 创建型模式:原型模式
  6. rocketdock 修改隐藏快捷键
  7. 服务器搭建——Wampserver32
  8. 串口字符串-HEX格式
  9. vue创建项目太慢、卡死
  10. 华为IE讲师:直通华为HCNA课程实战第一部分-安德-专题视频课程