第2章 Python 数字图像处理(DIP) --数字图像基础3 - 图像内插 - 最近邻内插 - 双线性插值 - 双三次内插 - 图像放大

目录

      • 图像内插
        • 放大图像

图像内插

内插通常在图像放大、缩小、旋转和几何校正等任务中使用。内插并用它来调整图像的大小(缩小和放大),缩小和放大基本上采用图像重取样方法

最近邻内插,这种方法将原图像中最近邻的灰度赋给了每个新位置,这种方法简单,但会产生我们不想要的人为失真,如严重的直边失真。更合适的方法是双线性内插,它使用4个最近邻的灰度来计算给定位置的灰度。令(x,y)(x, y)(x,y)表示待赋灰度值的位置(可将它相像为前面描述的网格点)的坐标,令v(x,y)v(x, y)v(x,y)表示灰度值。对于双线性内插方法,所赋的值由如下公式得到:
v(x,y)=ax+by+cxy+d(2.17)v(x, y) = ax + by + cxy + d \tag{2.17} v(x,y)=ax+by+cxy+d(2.17)
4 个系数可由点(x, y)的4个最近邻点写出的4个未知方程求出。双线性内插的结果要比最近邻内插的结果好得多,但计算量会随之增大。

def nearest_neighbor_interpolation(img, new_h, new_w):"""get nearest_neighbor_interpolation for image, can up or down scale image into any ratioparam: img: input image, grady image, 1 channel, shape like [512, 512]param: new_h: new image height param: new_w: new image widthreturn a nearest_neighbor_interpolation up or down scale image"""new_img = np.zeros([new_h, new_w])src_height, src_width = img.shape[:2]r = new_h / src_heightl = new_w / src_widthfor i in range(new_h):for j in range(new_w):x0 = int(i / r)y0 = int(j / l)new_img[i, j] = img[x0, y0]return new_img
# 最近邻插值法处理一通道的图像
img = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0638(a)(lenna_RGB).tif', 0)img_up = nearest_neighbor_interpolation(img, 1000, 1000)plt.figure(figsize=(16, 8))
plt.subplot(121), plt.imshow(img, 'gray')
plt.subplot(122), plt.imshow(img_up, 'gray')
plt.tight_layout()
plt.show()

在这里插入图片描述

# 最近邻插值法处理RGB 3通过的图像
img = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0638(a)(lenna_RGB).tif', -1)
img = img[..., ::-1]
img_up_1 = nearest_neighbor_interpolation(img[..., 0], 800, 800)
img_up_2 = nearest_neighbor_interpolation(img[..., 1], 800, 800)
img_up_3 = nearest_neighbor_interpolation(img[..., 2], 800, 800)
img_up = np.uint8(np.dstack((img_up_1, img_up_2, img_up_3)))plt.figure(figsize=(16, 8))
plt.subplot(121), plt.imshow(img, 'gray')
plt.subplot(122), plt.imshow(img_up, 'gray')
plt.tight_layout()
plt.show()

在这里插入图片描述

双线性插值

又称为双线性内挺。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。

假设我们想得到未知函数f在点P=(x,y)f在点 P=(x,y)fP=(x,y)的值,假设我们已知函数f在Q11=(x1,y1),Q12=(x1,y2),Q21=(x2,y1),Q22=(x2,y2)f在Q_{11} = (x_1, y_1),Q_{12}=(x_1, y_2), Q_{21} = (x_2, y_1),Q_{22} = (x_2, y_2)fQ11=(x1,y1)Q12=(x1,y2),Q21=(x2,y1),Q22=(x2,y2)四个点的值。首先在x方向进行线性插值,得到:

f(R1)≈x2−xx2−x1f(Q11)+x−x1x2−x1f(Q21),whereR1=(x,y1)f(R_1) \approx \frac{x_2 - x}{x_2 - x_1} f(Q_{11}) + \frac{x-x_1}{x_2 - x_1} f(Q_{21}), where R_1 = (x, y_1) f(R1)x2x1x2xf(Q11)+x2x1xx1f(Q21),whereR1=(x,y1)
f(R2)≈x2−xx2−x1f(Q12)+x−x1x2−x1f(Q22),whereR2=(x,y2)f(R_2) \approx \frac{x_2 - x}{x_2 - x_1} f(Q_{12}) + \frac{x-x_1}{x_2 - x_1} f(Q_{22}), where R_2 = (x, y_2) f(R2)x2x1x2xf(Q12)+x2x1xx1f(Q22),whereR2=(x,y2)

然后在y方向进行线性插值,得到
f(P)≈y2−yy2−y1f(R1)+y−y1y2−y1f(R2)f(P) \approx \frac{y_2 - y}{y_2 - y_1} f(R_{1}) + \frac{y-y_1}{y_2 - y_1} f(R_{2})f(P)y2y1y2yf(R1)+y2y1yy1f(R2)

def bilinear_interpolation(img, new_h, new_w):"""get nearest_neighbor_interpolation for image, can up or down scale image into any ratioparam: img: input image, grady image, 1 channel, shape like [512, 512]param: new_h: new image height param: new_w: new image widthreturn a nearest_neighbor_interpolation up or down scale image"""src_height, src_width = img.shape[:2]if new_h == src_height and new_w == src_width:return img.copy()new_img = np.zeros([new_h, new_w])for i in range(new_h):for j in range(new_w):# 首先要找到在原图中对应点的(x, y)x = (i+0.5) * src_height / new_h - 0.5y = (j+0.5) * src_width / new_w - 0.5# find the coordinates of the points which will be used to compute the interpolationsrc_x0 = int(np.floor(x))src_x1 = min(src_x0 + 1 , src_height - 1)src_y0 = int(np.floor(y))src_y1 = min(src_y0 + 1, src_width - 1)# calculate the interpolationtemp0 = (src_x1 - x) * img[src_x0, src_y0] + (x - src_x0) * img[src_x1, src_y0]temp1 = (src_x1 - x) * img[src_x0, src_y1] + (x - src_x0) * img[src_x1, src_y1]new_img[i, j] = int((src_y1 - y) * temp0 + (y - src_y0) * temp1)return new_img
# 最近邻插值法处理一通道的图像
img = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0638(a)(lenna_RGB).tif', 0)img_up = bilinear_interpolation(img, 800, 800)plt.figure(figsize=(16, 8))
plt.subplot(121), plt.imshow(img, 'gray')
plt.subplot(122), plt.imshow(img_up, 'gray')
plt.tight_layout()
plt.show()

在这里插入图片描述

双三次内插

双三次插值的目的就是通过找到一种关系,或者说系数,可以把这16个像素对于P处像素值的影响因子找出来,从而根据这个影响因子来获得目标图像对应点的像素值,达到图像缩放的目的。

Bicubic基函数形式如下:
W(x)={(a+2)∣x∣3−(a+3)∣x∣2+1,∣x∣≤1a∣x∣3−5a∣x∣2+8a∣x∣−4a,1<∣x∣<20,otherwiseW(x) =\begin{cases} (a+2) |x|^3 - (a+3)|x|^2 + 1, & |x| \leq 1 \\a|x|^3 -5a|x|^2 + 8a|x| -4a, & 1 < |x| < 2 \\ 0, & \text{otherwise}\end{cases} W(x)=(a+2)x3(a+3)x2+1,ax35ax2+8ax4a,0,x11<x<2otherwise

a=−1a=-1a=1
a=−0.5a=-0.5a=0.5才能完美的实现内插

插值计算公式:
∑i=03∑j=03aijxiyi\sum_{i=0}^3 \sum_{j=0}^3 a_{ij}x^iy^i i=03j=03aijxiyi

def bicubic(x):"""BiCubic primary fuction"""x = abs(x)a = -0.5if x <= 1:return (a + 2) * (x**3) - (a + 3) * (x**2) + 1elif x < 2:return a * (x**3) - 5 * a * (x**2) +  (8 * a * x) - (4 * a)else:return 0
def bicubic_interpolation(img, new_h, new_w):src_height, src_width = img.shape[:2]new_img = np.zeros([new_h, new_w])for h in range(new_h):for w in range(new_w):src_x = h * (src_height / new_h)src_y = w * (src_width / new_w)x = int(np.floor(src_x))y = int(np.floor(src_y))u = src_x - xv = src_y - ytemp = 0for i in range(-1, 2):for j in range(-1, 2):if x + i < 0 or y + j < 0 or x + i >= src_height or y + j >= src_width:continuetemp += img[x+i, y+j] * bicubic(i - u) * bicubic(j - v)new_img[h, w] = np.clip(temp, 0, 255)return new_img
# 最近邻插值法处理一通道的图像
img = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0638(a)(lenna_RGB).tif', 0)img_up = bicubic_interpolation(img, 800, 800)
# img_up = cv2.resize(img, (800, 800), cv2.INTER_CUBIC)plt.figure(figsize=(16, 8))
plt.subplot(121), plt.imshow(img, 'gray')
plt.subplot(122), plt.imshow(img_up, 'gray')
plt.tight_layout()
plt.show()

在这里插入图片描述

# 先裁剪图像,然后把裁剪的图像缩小,再进行最近邻、双线内插、双三次内插放大,对比效果
img = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH02/Fig0220(a)(chronometer 3692x2812  2pt25 inch 1250 dpi).tif', 0)img = img[1100:3500, 200:2600]
img = cv2.resize(img, (200, 200), interpolation=cv2.INTER_CUBIC)new_h, new_w = 2400, 2400
img_nearest = nearest_neighbor_interpolation(img, new_h, new_w)
img_bilinear = bilinear_interpolation(img, new_h, new_w)
img_bicubic = bicubic_interpolation(img, new_h, new_w)plt.figure(figsize=(18, 6))
plt.subplot(131), plt.imshow(img_nearest, 'gray'), plt.title('Nearest'), #plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.imshow(img_bilinear, 'gray'), plt.title('Bilinear'), #plt.xticks([]), plt.yticks([])
plt.subplot(133), plt.imshow(img_bicubic, 'gray'), plt.title('Bicubic'), #plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

在这里插入图片描述

放大图像

def up_sample_2d(img):"""up sample 2d image, if your image is RGB, you could up sample each channel, then use np.dstack to merge a RGB imageparam: input img: it's a 2d gray imagereturn a 2x up sample image"""height, width = img.shape[:2]temp = np.zeros([height*2, width*2])temp[::2, ::2] = imgtemp[1::2, 1::2] = imgtemp[0::2, 1::2] = imgtemp[1::2, 0::2] = imgreturn temp
# up sample image using Numpy
img = np.random.random([12, 12])
up = up_sample_2d(img)
down = np.zeros([12, 12])
down = up[::2, ::2]
plt.figure(figsize=(15, 5))
plt.subplot(1,3,1), plt.imshow(img),# plt.xticks([]), plt.yticks([])
plt.subplot(1,3,2), plt.imshow(up),# plt.xticks([]), plt.yticks([])
plt.subplot(1,3,3), plt.imshow(down),# plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

# 等比2倍放大
img_ori = cv2.imread("DIP_Figures/DIP3E_Original_Images_CH06/Fig0638(a)(lenna_RGB).tif")
img_ori = img_ori[:, :, ::-1]temp = []
for i in range(img_ori.shape[-1]):temp.append(up_sample_2d(img_ori[:, :, i]))
up1 = np.uint8(np.dstack(temp))temp = []
for i in range(up1.shape[-1]):temp.append(up_sample_2d(up1[:, :, i]))
up2 = np.uint8(np.dstack(temp))plt.figure(figsize=(21, 7))
plt.subplot(1,3,1), plt.imshow(img_ori), plt.title("Original"),# plt.xticks([]), plt.yticks([])
plt.subplot(1,3,2), plt.imshow(up1), plt.title("2X"),# plt.xticks([]), plt.yticks([])
plt.subplot(1,3,3), plt.imshow(up2), plt.title("4X"),# plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

然爸读书笔记(2014-2)----影响力

第一章&#xff1a;影响力的武器 动物可能会看到某种颜色的羽毛而变得具有攻击性&#xff0c;或者听到某种叫声久对自己的天敌呵护有加。动物的这种愚蠢机械反应在人类身上也有&#xff0c;在某个触发特征出现时&#xff0c;我们会不假思索的做出相应的反应&#xff0c;之所以会…

pb 如何导出csv_Firefox火狐浏览器将提供导出密码至本地的功能

6月2日&#xff0c;据外媒All About Lifehacks报道&#xff0c;Mozilla官方的bug报告页面显示&#xff0c;Firefox浏览器的导出或备份密码请求的问题在前两天被关闭&#xff0c;并被标记为已解决。据了解&#xff0c;该请求早在多年前就有人提出。如今被标记为已解决&#xff0…

跟着别人的感觉做网络推广之二

无意中闯入了站台网&#xff08;一家历史很悠久的分类信息网站&#xff0c;印象中比58 赶集 百姓创办时间还早。&#xff09; 进入后当然看医疗分类了&#xff1a; http://www.zhantai.com/ 站台网&#xff0c;不是大的省份网民不能位置定位时&#xff0c;默认进入的是北京分站…

iOS - OC 面向对象语法

1、类 1&#xff09;根类&#xff1a;因为类 NSObject 是层次结构的最顶层&#xff0c;因此称为根类。 可以将类称为子类&#xff08;subclass&#xff09;和父类&#xff08;superclass&#xff09;&#xff0c;也可以将类称为子类和超类。2&#xff09;分类&#xff0f;类别&…

第2章 Python 数字图像处理(DIP) --数字图像基础4 -- 像素间的一些基本关系 - 邻域 - 距离测试

目录像素间的一些基本关系像素的相邻像素距离测试import sys import numpy as np import cv2 import matplotlib import matplotlib.pyplot as plt import PIL from PIL import Imageprint(f"Python version: {sys.version}") print(f"Numpy version: {np.__ve…

iphone备忘录突然没了_苹果突然下架12 天猫:双11有惊喜!iPhone12 mini配色缩水

点击“蓝字”关注我们苹果旗舰店突然下架iPhone 12 天猫回应&#xff1a;请期待11.11的惊喜今天&#xff0c;有网友反馈&#xff0c;苹果天猫旗舰店的iPhone 12和iPhone 12 Pro被下架了。小编查看了下&#xff0c;天猫Apple Store旗舰店确实已经下降了目前在售的 iPhone 12 和 …

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波1 - 灰度变换和空间滤波基础、Sigmoid激活函数

这里写目录标题本节的目标背景灰度变换和空间滤波基础本节的目标 了解空间域图像处理的意义&#xff0c;以及它与变换域图像处理的区别熟悉灰度变换所有的主要技术了解直方图的意义以及如何操作直方图来增强图像了解空间滤波的原理 import sys import numpy as np import cv2…

absolute 必须 relative_Workfine如何控制身份证号码必须为18位?

在信息化系统的设计中&#xff0c;由于业务的需要&#xff0c;我们往往需要设置许多控制项&#xff0c;以保证系统能够按照业务要求流转&#xff0c;必须出库数量不能超过库存&#xff0c;人员信息不能重复录入&#xff0c;考勤区间不能有交叉等。此篇以实例的方式告诉大家如果…

ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(2)用户登录、注销

上次实现了用户注册&#xff0c;这次来实现用户登录&#xff0c;用到IAuthenticationManager的SignOut、SignIn方法和基于声明的标识。最后修改用户注册代码实现注册成功后直接登录。 目录&#xff1a; ASP.NET MVC5 网站开发实践 - 概述 ASP.NET MVC5 网站开发实践(一) - 项目…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波2 - 图像反转、对数变换

目录一些基本的灰度变换函数图像反转对数变换一些基本的灰度变换函数 如下图显示了在图像处理中频繁使用的3类基本函数&#xff1a; 线性&#xff08;反转和恒等变换&#xff09;函数对数&#xff08;对数和反对数变换&#xff09;函数幂律&#xff08;nnn次幂和nnn次根变换&…

为Android应用程序添加社会化分享功能

正在做个android的小应用&#xff0c;有点想尝试一下社会化分享&#xff0c;比如分享到新浪微博啥的。看一下新浪&#xff0c;人人网的API&#xff0c;说实话功能很全很强大&#xff0c;但虽说有相对的SDK&#xff0c;但是总觉得不方便。因为正在使用友盟的统计SDK&#xff0c;…

安卓手机浏览器排行_安卓手机双11性价比排行发布|拯救者手机发透明版|小米发大光圈手机镜头...

智友新闻2020-11-05本期摘要&#xff1a;①安卓手机双11性价比排行榜发布②联想拯救者电竞手机 Pro 至尊透明版启动预约③小米发伸缩式大光圈镜头概念安卓手机双11性价比排行榜发布 安兔兔近日发布了安卓手机双11性价比排行榜。该榜单的统计维度为 2020年10月1日至10月31日。其…

SQL Server 2008故障转移集群+数据库镜像配置实例之三

前两篇文章已经建立了SQL 2008 的故障转移集群&#xff0c;由于故障转移集群存在一个单点故障&#xff0c;既是当网络存储设备不可用时&#xff0c;整个集群就不可用了。所以为了获得更好的高可用特性和容灾机制&#xff0c;我们可以将集群中的某一特定SQL数据库配置一个镜像数…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波3 -幂律变换、伽马变换

目录幂律&#xff08;伽马&#xff09;变换幂律&#xff08;伽马&#xff09;变换 scrγ(3.5)s c r^{\gamma} \tag{3.5}scrγ(3.5) c和γc和\gammac和γ是正常数。考虑到偏移&#xff08;即输入为0时的一个可度量输出&#xff09;&#xff0c;可改写为sc(rϵ)γs c (r \epsi…

没有与参数列表匹配的 重载函数 strcpy_s 实例_Zemax光学设计实例(84)Ftheta扫描平场透镜的设计...

导论&#xff1a;F-theta透镜又叫激光扫描聚焦镜&#xff0c;是激光加工行业必不可少的光学元件之一。对于理想薄透镜&#xff0c;光束的偏转角度与轨迹位置的关系为YF*tan(θ)&#xff0c;这种非线性关系会使得匀速偏转的振镜扫描速度与轨迹运动速度是不匹配的&#xff0c;导致…

MongoDB学习笔记(一)--基础

Insert MongoDB在执行插入时&#xff0c;首先会将插入的数据转换成BSON格式。然后MongoDB数据库会对BSON进行解剖&#xff0c;并检查是否存在_id建。 >doc {"_id" : 1…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波4 - 分段线性变换 - 对比度拉伸

目录分段线性变换对比度拉伸最大最小值拉伸分段线性变换 优点 形式可以任意复杂 缺点 要求用户输入很多参数 对比度拉伸 光照不足、成像传感器的动态范围偏小、图像获取过程中镜头孔径的设置错误 点(r1,s1)和点(r2,s2)(r_1, s_1)和点(r_2, s_2)(r1​,s1​)和点(r2​,s2​…

2017网易内推编程题(判断单词):解答代码

2019独角兽企业重金招聘Python工程师标准>>> 小易喜欢的单词具有以下特性&#xff1a; 1.单词每个字母都是大写字母 2.单词没有连续相等的字母 3.单词没有形如“xyxy”(这里的x&#xff0c;y指的都是字母&#xff0c;并且可以相同)这样的子序列&#xff0c;子序列可…

iphone查看删除的短信_想要恢复已经删除的的短信怎么办?

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到文章了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。 …

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波5 - 分段线性变换 - 灰度级分层

目录灰度级分层灰度级分层 二值图像 将感兴趣范围内的所有灰显示为一个值&#xff08;白色&#xff09;&#xff0c;而将其它灰度值显示为另一个值&#xff08;黑色&#xff09; 其他灰度级不变 使期望的灰度范围变量&#xff08;或变暗&#xff09;&#xff0c;但保持图像中…