python实现图像缩放算法

图像缩放算法

      • 1.最近邻插值图像缩放算法详解
        • 算法步骤
        • Python 实现
        • 详细解释
      • 优缺点
      • 2.双线性插值图像缩放算法详解
        • 算法步骤
        • Python 实现
        • 详细解释
      • 优缺点
      • 3.双三次插值图像缩放算法详解
        • 算法步骤
        • Python 实现
        • 详细解释
      • 优缺点

1.最近邻插值图像缩放算法详解

最近邻插值(Nearest Neighbor Interpolation)是一种简单且直观的图像缩放算法。它通过选择离目标像素最近的原始像素的颜色值来确定目标像素的颜色值。尽管这种方法计算速度快,但由于未考虑周围像素的颜色信息,图像在放大时可能会出现明显的锯齿效应。

算法步骤
  1. 计算缩放比例:确定新图像和原始图像的宽高比例。
  2. 遍历新图像像素:逐个计算新图像中每个像素的位置。
  3. 确定最近邻像素:对于新图像中的每个像素,找到对应的原始图像中的最近邻像素。
  4. 赋值:将原始图像中最近邻像素的颜色值赋给新图像中的像素。
Python 实现

以下是最近邻插值图像缩放算法的Python实现代码:

import numpy as np
from PIL import Imagedef nearest_neighbor_interpolation(image, new_width, new_height):original_width, original_height = image.size  # 获取原始图像的宽度和高度new_image = Image.new("RGB", (new_width, new_height))  # 创建一个新的图像对象pixel_map = new_image.load()  # 获取新图像的像素映射# 遍历新图像的每个像素for i in range(new_width):for j in range(new_height):# 计算在原始图像中对应的像素位置x = int(i * original_width / new_width)y = int(j * original_height / new_height)# 获取原始图像中对应像素的颜色值,并赋值给新图像的当前像素pixel_map[i, j] = image.getpixel((x, y))return new_image# 示例用法
if __name__ == "__main__":image = Image.open('example.jpg')  # 打开原始图像new_width, new_height = 800, 600  # 定义新图像的宽度和高度new_image = nearest_neighbor_interpolation(image, new_width, new_height)  # 调用最近邻插值函数new_image.show()  # 显示新图像new_image.save('resized_example.jpg')  # 保存新图像
详细解释
  1. 读取图像和创建新图像

    image = Image.open('example.jpg')
    new_image = Image.new("RGB", (new_width, new_height))
    
  2. 遍历新图像的每个像素

    for i in range(new_width):for j in range(new_height):
    
  3. 计算对应的原始图像像素位置

    x = int(i * original_width / new_width)
    y = int(j * original_height / new_height)
    
  4. 获取原始图像像素的颜色并赋值给新图像

    pixel_map[i, j] = image.getpixel((x, y))
    

优缺点

优点

  • 简单快速:算法简单,计算速度快,适合实时处理。
  • 实现容易:代码简单易懂,适合入门学习图像处理。

缺点

  • 锯齿效应:在图像放大时容易出现锯齿效应,图像质量不高。
  • 细节丢失:在图像缩小时可能会丢失一些细节。

尽管最近邻插值在某些应用场景中足够使用,但在需要更高质量图像的场景中,通常会选择更加复杂的插值方法,如双线性插值或双三次插值。

2.双线性插值图像缩放算法详解

双线性插值(Bilinear Interpolation)是一种常用的图像缩放算法。它通过考虑目标像素周围四个像素的颜色值,使用双线性插值公式计算出目标像素的颜色值。相较于最近邻插值,双线性插值能生成更平滑的图像效果。

算法步骤
  1. 计算缩放比例:确定新图像和原始图像的宽高比例。
  2. 遍历新图像像素:逐个计算新图像中每个像素的位置。
  3. 确定邻近像素:找到目标像素在原始图像中的对应位置,确定其周围的四个像素。
  4. 双线性插值计算:使用双线性插值公式计算目标像素的颜色值。
Python 实现

以下是双线性插值图像缩放算法的Python实现代码:

import numpy as np
from PIL import Imagedef bilinear_interpolation(image, new_width, new_height):original_width, original_height = image.size  # 获取原始图像的宽度和高度new_image = Image.new("RGB", (new_width, new_height))  # 创建一个新的图像对象pixel_map = new_image.load()  # 获取新图像的像素映射for i in range(new_width):for j in range(new_height):# 计算在原始图像中对应的浮点像素位置x = i * (original_width - 1) / new_widthy = j * (original_height - 1) / new_height# 计算相邻四个像素的位置x1 = int(x)x2 = min(x1 + 1, original_width - 1)y1 = int(y)y2 = min(y1 + 1, original_height - 1)# 计算插值权重dx = x - x1dy = y - y1# 获取相邻四个像素的颜色值p1 = np.array(image.getpixel((x1, y1)))p2 = np.array(image.getpixel((x2, y1)))p3 = np.array(image.getpixel((x1, y2)))p4 = np.array(image.getpixel((x2, y2)))# 计算目标像素的颜色值pixel_value = (1 - dx) * (1 - dy) * p1 + dx * (1 - dy) * p2 + (1 - dx) * dy * p3 + dx * dy * p4pixel_map[i, j] = tuple(pixel_value.astype(int))return new_image# 示例用法
if __name__ == "__main__":image = Image.open('example.jpg')  # 打开原始图像new_width, new_height = 800, 600  # 定义新图像的宽度和高度new_image = bilinear_interpolation(image, new_width, new_height)  # 调用双线性插值函数new_image.show()  # 显示新图像new_image.save('resized_example.jpg')  # 保存新图像
详细解释
  1. 读取图像和创建新图像

    image = Image.open('example.jpg')
    new_image = Image.new("RGB", (new_width, new_height))
    
  2. 遍历新图像的每个像素

    for i in range(new_width):for j in range(new_height):
    
  3. 计算对应的原始图像浮点位置

    x = i * (original_width - 1) / new_width
    y = j * (original_height - 1) / new_height
    
  4. 确定相邻四个像素的位置

    x1 = int(x)
    x2 = min(x1 + 1, original_width - 1)
    y1 = int(y)
    y2 = min(y1 + 1, original_height - 1)
    
  5. 计算插值权重

    dx = x - x1
    dy = y - y1
    
  6. 获取相邻四个像素的颜色值

    p1 = np.array(image.getpixel((x1, y1)))
    p2 = np.array(image.getpixel((x2, y1)))
    p3 = np.array(image.getpixel((x1, y2)))
    p4 = np.array(image.getpixel((x2, y2)))
    
  7. 计算目标像素的颜色值

    pixel_value = (1 - dx) * (1 - dy) * p1 + dx * (1 - dy) * p2 + (1 - dx) * dy * p3 + dx * dy * p4
    pixel_map[i, j] = tuple(pixel_value.astype(int))
    

优缺点

优点

  • 平滑效果好:生成的图像更加平滑,减少了锯齿效应。
  • 适用广泛:在各种图像处理应用中广泛使用,平衡了计算复杂度和图像质量。

缺点

  • 计算复杂度较高:相比最近邻插值,计算量更大,处理速度较慢。
  • 细节保留一般:在某些情况下,细节保留效果不如双三次插值。

在这里插入图片描述

双线性插值是图像缩放中常用的方法之一,适合需要平滑效果但计算资源有限的应用场景。

3.双三次插值图像缩放算法详解

双三次插值(Bicubic Interpolation)是一种高级的图像缩放算法。它通过考虑目标像素周围16个像素的颜色值,使用双三次插值公式计算出目标像素的颜色值。相较于双线性插值,双三次插值能生成更平滑、更细腻的图像效果。

算法步骤
  1. 计算缩放比例:确定新图像和原始图像的宽高比例。
  2. 遍历新图像像素:逐个计算新图像中每个像素的位置。
  3. 确定邻近像素:找到目标像素在原始图像中的对应位置,确定其周围的16个像素。
  4. 双三次插值计算:使用双三次插值公式计算目标像素的颜色值。
Python 实现

以下是双三次插值图像缩放算法的Python实现代码:

import numpy as np
from PIL import Imagedef cubic_weight(t, a=-0.5):"""计算三次插值核函数的权重"""t = np.abs(t)if t <= 1:return (a + 2) * t**3 - (a + 3) * t**2 + 1elif t <= 2:return a * t**3 - 5 * a * t**2 + 8 * a * t - 4 * aelse:return 0def bicubic_interpolation(image, new_width, new_height):original_width, original_height = image.sizenew_image = Image.new("RGB", (new_width, new_height))pixel_map = new_image.load()image_array = np.array(image)for i in range(new_width):for j in range(new_height):# 计算在原始图像中对应的浮点像素位置x = i * (original_width - 1) / new_widthy = j * (original_height - 1) / new_heightx1 = int(np.floor(x))y1 = int(np.floor(y))# 初始化颜色值r, g, b = 0, 0, 0# 双三次插值计算for m in range(-1, 3):for n in range(-1, 3):xm = min(max(x1 + m, 0), original_width - 1)yn = min(max(y1 + n, 0), original_height - 1)weight = cubic_weight(x - xm) * cubic_weight(y - yn)pixel = image_array[yn, xm]r += pixel[0] * weightg += pixel[1] * weightb += pixel[2] * weight# 赋值给新图像的像素pixel_map[i, j] = (int(r), int(g), int(b))return new_image# 示例用法
if __name__ == "__main__":image = Image.open('example.jpg')  # 打开原始图像new_width, new_height = 800, 600  # 定义新图像的宽度和高度new_image = bicubic_interpolation(image, new_width, new_height)  # 调用双三次插值函数new_image.show()  # 显示新图像new_image.save('resized_example.jpg')  # 保存新图像
详细解释
  1. 三次插值核函数

    def cubic_weight(t, a=-0.5):"""计算三次插值核函数的权重"""t = np.abs(t)if t <= 1:return (a + 2) * t**3 - (a + 3) * t**2 + 1elif t <= 2:return a * t**3 - 5 * a * t**2 + 8 * a * t - 4 * aelse:return 0
    
  2. 读取图像和创建新图像

    image = Image.open('example.jpg')
    new_image = Image.new("RGB", (new_width, new_height))
    
  3. 遍历新图像的每个像素

    for i in range(new_width):for j in range(new_height):
    
  4. 计算对应的原始图像浮点位置

    x = i * (original_width - 1) / new_width
    y = j * (original_height - 1) / new_height
    x1 = int(np.floor(x))
    y1 = int(np.floor(y))
    
  5. 双三次插值计算

    # 初始化颜色值
    r, g, b = 0, 0, 0# 双三次插值计算
    for m in range(-1, 3):for n in range(-1, 3):xm = min(max(x1 + m, 0), original_width - 1)yn = min(max(y1 + n, 0), original_height - 1)weight = cubic_weight(x - xm) * cubic_weight(y - yn)pixel = image_array[yn, xm]r += pixel[0] * weightg += pixel[1] * weightb += pixel[2] * weight
    
  6. 赋值给新图像的像素

    pixel_map[i, j] = (int(r), int(g), int(b))
    

优缺点

优点

  • 高质量:生成的图像更加平滑,细节更丰富。
  • 适用广泛:在需要高质量图像处理的应用中广泛使用。

缺点

  • 计算复杂度高:相比双线性插值,计算量更大,处理速度较慢。
  • 实现复杂:代码复杂度高,不适合实时处理。

在这里插入图片描述

双三次插值是图像缩放中高质量的方法之一,适合需要高质量图像处理的应用场景。

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

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

相关文章

go-kratos 学习笔记(4) 服务注册与发现 nacos注册

接口实现​ Registry 接口分为两个&#xff0c;Registrar 为实例注册和反注册&#xff0c;Discovery 为服务实例列表获取 type Registrar interface {// 注册实例Register(ctx context.Context, service *ServiceInstance) error// 反注册实例Deregister(ctx context.Context…

ubuntu系统vscode调试c/c++大中型项目

文章目录 1. 插件2. 项目工程3. vsode的配置setting.jsonc_cpp_properties.json 4. 启动调试 前置阅读 vscode调试第一篇 1. 插件 c/c, cmake, cmake tools 2. 项目工程 对于我的项目需要用到很多的三方库&#xff0c;三方库的版本又会有很多&#xff0c;一般都是用cmake编译…

QT写一个mainWindow

切换风格的写法&#xff1a; 先看看样式效果&#xff1a; mian_window.h文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow();void Ini…

对比预测编码表示学习

对比预测编码表示学习 引言 文章主要提出如下几点&#xff1a;首先将高维数据压缩到更加紧凑的潜在嵌入&#xff08;latent embdding&#xff09;空间&#xff0c;在这个空间中条件预测更容易被建模。第二&#xff0c;在这个潜在空间中使用自回归模型&#xff0c;以对未来的多…

DC系列靶场---DC 2靶场的渗透测试(一)

信息收集 Nmap扫描 nmap -sV -p- -sC -T4 172.30.1.141 域名解析 echo 172.30.1.141 dc-2 >> /etc/hosts 目录枚举 gobuster dir -u http://172.30.1.141 -w work/lab/CTF/ATT_CK_01/SecLists-master/Discovery/Web-Content/big.txt -x .php,.rar,.html,.zip -t 20 -b…

探索XEX数字资产交易的优势与操作指南

随着数字资产市场的快速发展&#xff0c;越来越多的投资者开始关注并参与其中。XEX交易所作为一个新兴的数字资产交易平台&#xff0c;以其用户友好的界面和高效的交易服务&#xff0c;迅速吸引了大量用户。本文将介绍XEX数字资产交易的主要特点和优势&#xff0c;帮助新手更好…

物联网在电力行业的应用

作者主页: 知孤云出岫 这里写目录标题 作者主页:物联网在电力行业的应用简介主要应用领域代码案例分析1. 智能电表数据采集和分析2. 设备监控和预测性维护3. 能耗管理和优化4. 电力负载预测5. 分布式能源管理6. 电动汽车充电管理7. 电网安全与故障检测 物联网在电力行业的应用…

python+onlyoffice+vue3项目实战20240722笔记,环境搭建和前后端基础代码

开发后端 先创建data目录,然后在data目录下创建一个test.docx测试文档。 后端代码: import json import req import api from api import middleware, PlainTextResponseasync def doc_callback(request):data = await api.req.get_json(request)print("callback ==…

数据结构——堆(C语言版)

树 树的概念&#xff1a; 树&#xff08;Tree&#xff09;是一种抽象数据结构&#xff0c;它由节点&#xff08;node&#xff09;的集合组成&#xff0c;这些节点通过边相连&#xff0c;把 节点集合按照逻辑顺序抽象成图像&#xff0c;看起来就像一个倒挂着的树&#xff0c;也…

使用C#手搓Word插件

WordTools主要功能介绍 编码语言&#xff1a;C#【VSTO】 1、选择 1.1、表格 作用&#xff1a;全选文档中的表格&#xff1b; 1.2、表头 作用&#xff1a;全选文档所有表格的表头【第一行】&#xff1b; 1.3、表正文 全选文档中所有表格的除表头部分【除第一行部分】 1.…

java面向对象进阶篇--《多态》

目录 一、前言 二、认识多态 方法重写&#xff08;Override&#xff09;&#xff1a; 方法重载&#xff08;Overload&#xff09;&#xff1a; 示例&#xff1a; Person类&#xff08;父类&#xff09; Administrator&#xff08;子类&#xff09; Student&#xff08;子…

docker搭建ES 8.14 集群

参考&#xff1a;【docker搭建es8集群kibana】_docker 安装生产级 es 8.14 集群-CSDN博客 1、之前已搭建一台单机版的dockerES集群 参见 Elasticsearch docker 安装_docker 安装es8.14.3-CSDN博客 2、现在需要重新搭建为docker ES集群 准备新搭建3个点 一、准备工作 提前开…

构建网络安全之盾:应对“微软蓝屏”教训的全面策略

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

深度学习模型Transformer结构

Transformer结构是一种基于自注意力&#xff08;Self-Attention&#xff09;机制的深度学习模型&#xff0c;最初由Vaswani等人在2017年的论文《Attention Is All You Need》中提出&#xff0c;用于解决自然语言处理&#xff08;NLP&#xff09;领域的任务&#xff0c;如机器翻…

MySQL --- 库的操作

一、创建数据库 create database [ if not exists ] 数据库名; // []中的为可选项 在创建库时&#xff0c;也可以指定数据库采用的字符集(character set)和数据库字符集的校验规则(collate) (当我们创建数据库没有指定字符集和校验规则时&#xff0c;系统使用默认字符集&#x…

【复习】软件工程

软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。 典型表现&#xff1a; 开发成本和进度的估计常常很不准确 用户对已完成的软件系统不满意&#xff0c;闭门造车 软件质量&#xff08;quality&#xff09;不可靠 软件常常是不可维护的 软件产品供不应…

css技巧混合模式

看上面这个神奇的效果&#xff0c;文字在黑色背景里面显示为白色&#xff0c;而在白色的背景里面显示为黑色&#xff0c;这就是文字智能适配背景。 看到这样的需求&#xff0c;大多数人第一时间想到的是&#xff0c;文字元素有两个&#xff0c;是完全重叠的两层&#xff0c;一…

Facebook在内容创作中的新策略与机会

随着社交媒体的不断发展&#xff0c;内容创作已经成为了平台吸引和留住用户的核心竞争力。Facebook作为全球最大的社交平台之一&#xff0c;不断调整和优化其内容创作策略&#xff0c;以适应用户需求的变化和技术的进步。本文将深入探讨Facebook在内容创作中的新策略与机会&…

考研复习7月进度严重滞后?

宇哥说&#xff1a;来不及了&#xff01; 因为基础30讲和强化36讲&#xff0c;加起来已经快300小时了。 所以&#xff0c;必须换个思路&#xff1a; 不看课行吗&#xff1f; 大多数人7月的情况是这样的&#xff1a; 1. 听完线代&#xff0c;高数知识点忘得差不多了&#xf…

JMeter接口测试-3.断言及参数化测试

1. 断言 JMeter官方断言&#xff08;Assertion&#xff09;的定义 用于检查测试中得到的响应数据是否符合预期&#xff0c;用于保证测试过程中的数据交互与预期一致 断言的目的&#xff1a; 一个取样器可以添加多个不同形式的断言&#xff0c;根据你的检查需求来添加相应的…