数字图像处理1 最近邻插值、双线性插值和双三次插值

news/2024/11/14 22:35:55/

数字图像处理1 最近邻插值、双线性插值和双三次插值

  • 任务
    • 1.介绍
    • 2.原理
    • 3.实现
    • 4.结果


任务

分别使用最近邻插值、双线性插值和双三次插值方法编程实现图像的等比例放大1.5倍的效果

1.介绍

内插通常在图像放大、缩小、旋转和几何校正等任务中使用。本文目标实现插值调整图像大小。
图像插值主要有最近邻插值、双线性插值、双三次插值等方法。
双三次插值通常能产生效果最好,最精确的插补图形,但它速度也几乎是最慢的。
“双线性插值”(Bilinear interpolation)的速度则要快一些,但没有前者精确。
在商业性图像编辑软件中,经常采用的是速度最快,但也是最不准确的“最近相邻”(Nearest Neighbor)插值。
其他一些插值技术通常只在高档或单独应用的程序中出现。

2.原理

参考博客

3.实现

import cv2
import numpy as np#最近邻插值
def zuijinling(s):m_new = m * am_new = int(m_new)n_new = n * an_new = int(n_new)T1 = np.zeros(shape=(m_new, n_new))for i in range(m_new):for j in range(n_new):if i/a >= m or j/a >= n:T1[i][j]=0else:T1[i][j]=s[round(i/a)][round(j/a)]T1 = T1.astype(np.uint8)  # 进行类型转换return T1#双线性插值
def shuangxianxing(s):z=s.astype(float)print(z[1][1].dtype)m_new = m * am_new = int(m_new)n_new = n * an_new = int(n_new)T1 = np.zeros(shape=(m_new, n_new))for i in range(m_new):for j in range(n_new):if i / a >= m or j / a >= n or int(i//a)+1>=m or int(j//a)+1>=n:T1[i][j] = 0else:x1 = int(i // a)y2 = int(j // a)x2 = x1 + 1y1 = y2 + 1T1[i][j] = ((y2-j/a)/(y2-y1))*((x2-i/a)/(x2-x1)*z[x1][y1] + (i/a-x1)/(x2-x1)*z[x2][y1]) + ((j/a-y1)/(y2-y1))*((x2-i/a)/(x2-x1)*z[x1][y2] + (i/a-x1)/(x2-x1)*z[x2][y2])T1 = T1.astype(np.uint8)  # 进行类型转换return T1#双三次插值
def shuangsanci(s):z = s.astype(float)# print(z[1][1].dtype)aa = -0.5m_new = m * am_new = int(m_new)n_new = n * an_new = int(n_new)T1 = np.zeros(shape=(m_new, n_new))for i in range(m_new):for j in range(n_new):if i / a >= m or j / a >= n or int(i // a) + 2 >= m or int(j // a) + 2 >= n:T1[i][j] = 0else:x1 = int(i // a)y1 = int(j // a)x0 = x1 - 1y0 = y1 - 1x2 = x1 + 1y2 = y1 + 1x3 = x2 + 1y3 = y2 + 1t001 = np.abs(i / a - x0)t002 = np.abs(j / a - y0)t101 = np.abs(i / a - x1)t102 = np.abs(j / a - y0)t201 = np.abs(i / a - x2)t202 = np.abs(j / a - y0)t301 = np.abs(i / a - x3)t302 = np.abs(j / a - y0)t011 = np.abs(i / a - x0)t012 = np.abs(j / a - y1)t021 = np.abs(i / a - x0)t022 = np.abs(j / a - y2)t031 = np.abs(i / a - x0)t032 = np.abs(j / a - y3)t111 = np.abs(i / a - x1)t112 = np.abs(j / a - y1)t211 = np.abs(i / a - x2)t212 = np.abs(j / a - y1)t311 = np.abs(i / a - x3)t312 = np.abs(j / a - y1)t121 = np.abs(i / a - x1)t122 = np.abs(j / a - y2)t221 = np.abs(i / a - x2)t222 = np.abs(j / a - y2)t321 = np.abs(i / a - x3)t322 = np.abs(j / a - y2)t131 = np.abs(i / a - x1)t132 = np.abs(j / a - y3)t231 = np.abs(i / a - x2)t232 = np.abs(j / a - y3)t331 = np.abs(i / a - x3)t332 = np.abs(j / a - y3)k11 = ((aa + 2) * pow(t111, 3) - (aa + 3) * pow(t111, 2) + 1) * ((aa + 2) * pow(t112, 3) - (aa + 3) * pow(t112, 2) + 1)k12 = ((aa + 2) * pow(t121, 3) - (aa + 3) * pow(t121, 2) + 1) * ((aa + 2) * pow(t122, 3) - (aa + 3) * pow(t122, 2) + 1)k21 = ((aa + 2) * pow(t211, 3) - (aa + 3) * pow(t211, 2) + 1) * ((aa + 2) * pow(t212, 3) - (aa + 3) * pow(t212, 2) + 1)k22 = ((aa + 2) * pow(t221, 3) - (aa + 3) * pow(t221, 2) + 1) * ((aa + 2) * pow(t222, 3) - (aa + 3) * pow(t222, 2) + 1)k00=(aa*pow(t001,3)-5*aa*pow(t001,2)+8*aa*t001-4*aa)*(aa*pow(t002,3)-5*aa*pow(t002,2)+8*aa*t002-4*aa)k10=(aa*pow(t101,3)-5*aa*pow(t101,2)+8*aa*t101-4*aa)*(aa*pow(t102,3)-5*aa*pow(t102,2)+8*aa*t102-4*aa)k20=(aa*pow(t201,3)-5*aa*pow(t201,2)+8*aa*t201-4*aa)*(aa*pow(t202,3)-5*aa*pow(t202,2)+8*aa*t202-4*aa)k30=(aa*pow(t301,3)-5*aa*pow(t301,2)+8*aa*t301-4*aa)*(aa*pow(t302,3)-5*aa*pow(t302,2)+8*aa*t302-4*aa)k01=(aa*pow(t011,3)-5*aa*pow(t011,2)+8*aa*t011-4*aa)*(aa*pow(t012,3)-5*aa*pow(t012,2)+8*aa*t012-4*aa)k31=(aa*pow(t311,3)-5*aa*pow(t311,2)+8*aa*t311-4*aa)*(aa*pow(t312,3)-5*aa*pow(t312,2)+8*aa*t312-4*aa)k02=(aa*pow(t021,3)-5*aa*pow(t021,2)+8*aa*t021-4*aa)*(aa*pow(t022,3)-5*aa*pow(t022,2)+8*aa*t022-4*aa)k32=(aa*pow(t321,3)-5*aa*pow(t321,2)+8*aa*t321-4*aa)*(aa*pow(t322,3)-5*aa*pow(t322,2)+8*aa*t322-4*aa)k03=(aa*pow(t031,3)-5*aa*pow(t031,2)+8*aa*t031-4*aa)*(aa*pow(t032,3)-5*aa*pow(t032,2)+8*aa*t032-4*aa)k13=(aa*pow(t131,3)-5*aa*pow(t131,2)+8*aa*t131-4*aa)*(aa*pow(t132,3)-5*aa*pow(t132,2)+8*aa*t132-4*aa)k23=(aa*pow(t231,3)-5*aa*pow(t231,2)+8*aa*t231-4*aa)*(aa*pow(t232,3)-5*aa*pow(t232,2)+8*aa*t232-4*aa)k33=(aa*pow(t331,3)-5*aa*pow(t331,2)+8*aa*t331-4*aa)*(aa*pow(t332,3)-5*aa*pow(t332,2)+8*aa*t332-4*aa)T1[i][j] = z[x0][y0]*k00 + z[x0][y1]*k01 + z[x0][y2]*k02 + z[x0][y3]*k03 + z[x1][y0]*k10 + z[x1][y1]*k11 + z[x1][y2]*k12 + z[x1][y3]*k13 + z[x2][y0]*k20 + z[x2][y1]*k21 + z[x2][y2]*k22 + z[x2][y3]*k23 + z[x3][y0]*k30 + z[x3][y1]*k31 + z[x3][y2]*k32 + z[x3][y3]*k33T1 = T1.astype(np.uint8)  # 进行类型转换return T1if __name__=='__main__':src = cv2.imread(r"C:\Users\Harry Wang\Desktop\1.png")gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)print(gray)m, n = gray.shapem = int(m)n = int(n)print(m, n)a = 1.5cv2.imshow('demo', gray)cv2.imshow('task1',zuijinling(gray))cv2.imshow('task2',shuangxianxing(gray))cv2.imshow('task3',shuangsanci(gray))cv2.waitKey(0)

4.结果

原图
原图
最近邻插值
最近邻插值
双线性插值
双线性插值
双三次插值
双三次插值


http://www.ppmy.cn/news/255208.html

相关文章

VOLTE实战经验

目录 1 参数与定时器配置(建议) 1.1 VoLTE 互操作类参数 1.2 VoLTE 功能类参数 1.3 定时器参数 1.3.1 接入类定时器 1.3.2 切换类定时器 1.3.3 重建类定时器 2 终端 IMS 注册问题 2.1 终端开机的 IMS 注册过程 SIP 信令注册 SIP 注册 3 关键…

LTE学习笔记 ——SIB

UE获得MIB消息后,得到PHICH相关信息。PHICH --->PCFICH --->PDCCH占用的符号数 --->PDSCH --->SIB1. SIB1时频资源 SIB1时域资源固定:SFN%20系统帧上的子帧5上。 频域资源位置不固定:由SI-RNTI加扰的PDCCH指示。 承载信道为PD…

LTE RRC 连接重建

1 概述 RRC 重建目的是恢复RRC信令连接,减少掉线。 但是RRC在源小区重建过多会影响小区吞吐量和用户感知。 本文介绍了RRC重建定义,触发条件和RRC在源小区重建过多、RRC重建成功率低的问题小区的处理。 2 RRC 重建 定义与触发条件 2.…

chatglm_langchain_demo

#Setup envirnment conda create -n langchain python3.8.1 -y conda activate langchain # 拉取仓库 git clone https://github.com/imClumsyPanda/langchain-ChatGLM.git # 安装依赖 cd langchain-ChatGLM python3 -m pip install -r requirements.txt python3 -m pip instal…

LTE网络中SIB2(系统消息2)信息详解

SIB2中包含公共的无线资源配置信息,如上行RACH、PUCCH、PUSCH、SRS的资源分配与调度,上行信道功率控制信息;下行BCCH、PDSCH、PCCH信道资源配置等,这些信息对理解当前系统上下行的资源使用及分析网络资源问题有很大帮助。系统消息…

OAI搭建步骤(EPC+eNB)

声明:本文CSDN作者原创投稿文章,未经许可禁止任何形式的转载,原文链接 文章目录 一、系统概述二、搭建核心网EPC(openair-cn)2.1 准备主机2.2 更换内核2.3 获取openair-cn源码2.4 编辑host2.5 安装必要的软件2.5.1 安装Mysql2.5.2 安装Apache…

Mybatis框架源码笔记(五)之Mybatis框架缓存机制原理解析

1 Mybatis框架的缓存模块 MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。Mybatis框架中的缓存分为一级缓存和二级缓存,三级缓存基本都要借助自定义缓存或第三方服务来进行实现。但本质上是一样的,都是借助Cache接…

T31Day12

对编码进行规约的好处 减少代码的维护成本改善可读性提高团队开发的合作效率锻炼出更加严谨的思维 代码格式与命名风格 命名体现代码元素特征 抽象类命名使用Abstract或Base开头异常类命名使用Exception结尾测试类命名以它要测试的类名开始,以Test结尾类型与中括号…