上采样(放大图像)和下采样(缩小图像)(最邻近插值和双线性插值的理解和实现)

上采样和下采样

什么是上采样和下采样?

• 缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的有
两个:1、使得图像符合显示区域的大小;2、生成对应图像的缩略图。
• 放大图像(或称为上采样(upsampling)或图像插值(interpolating))的主要目的
是放大原图像,从而可以显示在更高分辨率的显示设备上。
注意:
如果想放大一个图片或者一个图片,应该想到,当图片放大或缩小的时候,会增加或者减少像素点。比如说原来200×200的图片,要是想变成400×400的图片,就要多出3倍的像素点需要添加。而如何添加这些像素点就是问题的核心

原理:

上采样原理:内插值 (增加像素点)
下采样原理:(M/s) * (N/s) (等比例减少像素点)

最邻近插值The nearest interpolation

思想:

最邻近插值,思想就是他的名字,找插入像素点位置的最邻近的像素点,将其作为自己的像素值插入。
如图:
设i+u, j+v (i, j为正整数, u, v为大于零小于1的小数,下同)为待求象素坐标,则待求象素
灰度的值 f(i+u, j+v) 如下图所示:
在这里插入图片描述
如果在A区域插入像素点,该点的像素值就与(i,j)的像素值相同,同理,在B区域插入的像素点就与(i+1,j)的像素值相同。

算法实现:

import cv2
import numpy as np"""
最邻近插值The nearest interpolation实现
"""def function(img,aim_height,aim_width):height,width,channels = img.shape   #获得原图像的长宽和维度empty_img = np.zeros((aim_height,aim_width,channels),np.uint8)  #新建全0图像transform_h = aim_height/height #找到长的放大/缩小倍数transform_w = aim_width/width   #找到宽的放大/缩小倍数for i in range(aim_height):for j in range(aim_width):x = int(i/transform_h)  #找到最近邻点(这个点必须取整)y = int(j/transform_w)empty_img[i,j]=img[x,y] #将最近邻点的数值赋予新图像return empty_imgimg = cv2.imread("lenna.png")
transform_picture = function(img,800,800)   #800,800是新图像大小
cv2.imshow("transform picture",transform_picture)
cv2.waitKey(0)

实现结果:

在这里插入图片描述

双线性插值:

单线性插值:

要想知道什么是双线性插值,我们先来研究单线性插值:
在这里插入图片描述
如图所示,我们想要求(x,y)的y坐标,现在已知:x,(x0,y0),(x1,y1),该怎么求?
通过等比例的方法:可以获得如下推论
在这里插入图片描述
最后的结果就是红框部分公式

双线性插值:

这时候我们再看双线性插值:
在这里插入图片描述
我们将其拆解为X方向和Y方向的单线性插值。
通过Q11和Q21能够获得R1的值,再通过Q12和Q22获得R2的值,最后通过R1和R2推得P的值。
具体推理过程如下:
在这里插入图片描述
由于图像双线性插值只会用相邻的4个点,因此上述公式的分母都是1。

几何中心对齐:

目前还存在有问题:
坐标系的选择问题:在这里插入图片描述
如果源图像和目标图像的原点(0,0)均选择左上角,然后根据插值公式计算目标图像每点像素,假设你需要将一幅5x5的图像缩小成3x3,那么源图像和目标图像各个像素之间的对应关系如下:
在这里插入图片描述
也就是说,图像当以左上角为对齐点来看,会使偏右偏下的原像素点的价值变低,新插值点受偏左偏上的原像素点影响更大。
那么,让坐标加1或者选择右下角为原点怎么样呢?很不幸,还是一样的效果,不过这次得到的图像将偏右偏下。
最好的方法就是,两个图像的几何中心重合,并且目标图像的每个像素之间都是等间隔的,并且都和两边有一定的边距。
公式如下:
在这里插入图片描述
这里老师进行了公式的推导:
在这里插入图片描述

算法实现:

import cv2
import numpy as np"""
双线性插值实现
"""def bilinear_interpolation(img,out_dim):input_h,input_w,channels = img.shapeout_h,out_w = out_dim[0],out_dim[1]if input_h == out_h and input_w == out_w:   #若输出图像和输入图像要求相等,则输出原图像return img.copy()empty_img = np.zeros((out_h,out_w,channels),np.uint8)scale_x, scale_y = float(out_h / input_h),float(out_w / input_w)for i in range(channels):for dst_y in range(out_h):for dst_x in range(out_w):#几何中心对齐src_x = (dst_x + 0.5) / scale_x - 0.5src_y = (dst_y + 0.5) / scale_y - 0.5#找到插值周围点src_x0 = int(np.floor(src_x))src_x1 = min(src_x0 + 1, input_w - 1)src_y0 = int(np.floor(src_y))src_y1 = min(src_y0 + 1, input_h - 1)#双线性插值公式计算temp0 = (src_x1 - src_x) * img[src_y0, src_x0, i] + (src_x - src_x0) * img[src_y0, src_x1, i]temp1 = (src_x1 - src_x) * img[src_y1, src_x0, i] + (src_x - src_x0) * img[src_y1, src_x1, i]empty_img[dst_y, dst_x, i] = int((src_y1 - src_y) * temp0 + (src_y - src_y0) * temp1)return empty_imgif __name__ == '__main__':img = cv2.imread('lenna.png')transform_picture = bilinear_interpolation(img,(800,800))cv2.imshow('transform picture',transform_picture)cv2.waitKey()

实现结果:

在这里插入图片描述

最邻近插值与双线性插值的对比:

双线性差值法的计算比最邻近插值法复杂,计算量较大,但没有灰度不连续的缺点,图像看起来更光滑。
而最邻近插值更快,更简单。

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

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

相关文章

r语言绘制雷达图_用r绘制雷达蜘蛛图

r语言绘制雷达图I’ve tried several different types of NBA analytical articles within my readership who are a group of true fans of basketball. I found that the most popular articles are not those with state-of-the-art machine learning technologies, but tho…

java 分裂数字_分裂的补充:超越数字,打印物理可视化

java 分裂数字As noted in my earlier Nightingale writings, color harmony is the process of choosing colors on a Color Wheel that work well together in the composition of an image. Today, I will step further into color theory by discussing the Split Compleme…

结构化数据建模——titanic数据集的模型建立和训练(Pytorch版)

本文参考《20天吃透Pytorch》来实现titanic数据集的模型建立和训练 在书中理论的同时加入自己的理解。 一,准备数据 数据加载 titanic数据集的目标是根据乘客信息预测他们在Titanic号撞击冰山沉没后能否生存。 结构化数据一般会使用Pandas中的DataFrame进行预处理…

比赛,幸福度_幸福与生活满意度

比赛,幸福度What is the purpose of life? Is that to be happy? Why people go through all the pain and hardship? Is it to achieve happiness in some way?人生的目的是什么? 那是幸福吗? 人们为什么要经历所有的痛苦和磨难? 是通过…

带有postgres和jupyter笔记本的Titanic数据集

PostgreSQL is a powerful, open source object-relational database system with over 30 years of active development that has earned it a strong reputation for reliability, feature robustness, and performance.PostgreSQL是一个功能强大的开源对象关系数据库系统&am…

Django学习--数据库同步操作技巧

同步数据库:使用上述两条命令同步数据库1.认识migrations目录:migrations目录作用:用来存放通过makemigrations命令生成的数据库脚本,里面的生成的脚本不要轻易修改。要正常的使用数据库同步的功能,app目录下必须要有m…

React 新 Context API 在前端状态管理的实践

2019独角兽企业重金招聘Python工程师标准>>> 本文转载至:今日头条技术博客 众所周知,React的单向数据流模式导致状态只能一级一级的由父组件传递到子组件,在大中型应用中较为繁琐不好管理,通常我们需要使用Redux来帮助…

机器学习模型 非线性模型_机器学习模型说明

机器学习模型 非线性模型A Case Study of Shap and pdp using Diabetes dataset使用糖尿病数据集对Shap和pdp进行案例研究 Explaining Machine Learning Models has always been a difficult concept to comprehend in which model results and performance stay black box (h…

5分钟内完成胸部CT扫描机器学习

This post provides an overview of chest CT scan machine learning organized by clinical goal, data representation, task, and model.这篇文章按临床目标,数据表示,任务和模型组织了胸部CT扫描机器学习的概述。 A chest CT scan is a grayscale 3…

Pytorch高阶API示范——线性回归模型

本文与《20天吃透Pytorch》有所不同,《20天吃透Pytorch》中是继承之前的模型进行拟合,本文是单独建立网络进行拟合。 代码实现: import torch import numpy as np import matplotlib.pyplot as plt import pandas as pd from torch import …

作业要求 20181023-3 每周例行报告

本周要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2282 1、本周PSP 总计:927min 2、本周进度条 代码行数 博文字数 用到的软件工程知识点 217 757 PSP、版本控制 3、累积进度图 (1)累积代码折线图 &…

算命数据_未来的数据科学家或算命精神向导

算命数据Real Estate Sale Prices, Regression, and Classification: Data Science is the Future of Fortune Telling房地产销售价格,回归和分类:数据科学是算命的未来 As we all know, I am unusually blessed with totally-real psychic abilities.众…

openai-gpt_为什么到处都看到GPT-3?

openai-gptDisclaimer: My opinions are informed by my experience maintaining Cortex, an open source platform for machine learning engineering.免责声明:我的看法是基于我维护 机器学习工程的开源平台 Cortex的 经验而 得出 的。 If you frequent any part…

Pytorch高阶API示范——DNN二分类模型

代码部分: import numpy as np import pandas as pd from matplotlib import pyplot as plt import torch from torch import nn import torch.nn.functional as F from torch.utils.data import Dataset,DataLoader,TensorDataset""" 准备数据 &qu…

OO期末总结

$0 写在前面 善始善终,临近期末,为一学期的收获和努力画一个圆满的句号。 $1 测试与正确性论证的比较 $1-0 什么是测试? 测试是使用人工操作或者程序自动运行的方式来检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别的过程。 它…

数据可视化及其重要性:Python

Data visualization is an important skill to possess for anyone trying to extract and communicate insights from data. In the field of machine learning, visualization plays a key role throughout the entire process of analysis.对于任何试图从数据中提取和传达见…

【洛谷算法题】P1046-[NOIP2005 普及组] 陶陶摘苹果【入门2分支结构】Java题解

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P1046-[NOIP2005 普及组] 陶陶摘苹果【入门2分支结构】Java题解🌏题目…

python多项式回归_如何在Python中实现多项式回归模型

python多项式回归Let’s start with an example. We want to predict the Price of a home based on the Area and Age. The function below was used to generate Home Prices and we can pretend this is “real-world data” and our “job” is to create a model which wi…

充分利用UC berkeleys数据科学专业

By Kyra Wong and Kendall Kikkawa黄凯拉(Kyra Wong)和菊川健多 ( Kendall Kikkawa) 什么是“数据科学”? (What is ‘Data Science’?) Data collection, an important aspect of “data science”, is not a new idea. Before the tech boom, every industry al…

02-web框架

1 while True:print(server is waiting...)conn, addr server.accept()data conn.recv(1024) print(data:, data)# 1.得到请求的url路径# ------------dict/obj d["path":"/login"]# d.get(”path“)# 按着http请求协议解析数据# 专注于web业…