数字图像处理-matlab图像内插

news2024/11/26 11:48:45

matlab图像内插

    • 最近邻插值
    • 双线性插值
    • 双三次插值
    • 总结

最近邻插值

目标各像素点的灰度值代替源图像中与其最邻近像素的灰度值
参考博客
假设一个2X2像素的图片采用最近邻插值法需要放大到4X4像素的图片,右边该为多少?
在这里插入图片描述
最近邻插值法坐标变换计算公式:
s r c X = d s t X ∗ ( s r c W i d t h / d s t W i d t h ) srcX=dstX*(srcWidth/dstWidth) srcX=dstX(srcWidth/dstWidth)
s r c Y = d s t Y ∗ ( s r c H e i g h t / d s t H e i g h t ) srcY=dstY*(srcHeight/dstHeight) srcY=dstY(srcHeight/dstHeight)
d s t X dstX dstX d s t Y dstY dstY为目标图像的某个像素的横纵坐标, d s t W i d t h dstWidth dstWidth d s t H e i g h t dstHeight dstHeight为目标图像的长与宽;
s r c W i d t h srcWidth srcWidth s r c H e i g h t srcHeight srcHeight为原图像的宽度与高度。
s r c X srcX srcX s r c Y v srcYv srcYv为目标图像在该点 ( d s t X , d s t Y ) (dstX,dstY) dstXdstY对应的原图像的坐标。
在这里插入图片描述
右图为经过放大后的目标图像,?处的坐标为 ( 3 , 2 ) (3,2) (3,2),根据公式计算得到
s r c X = 3 ∗ ( 2 / 4 ) = 1.5 , s r c Y = 2 ∗ ( 2 / 4 ) = 1 srcX=3*(2/4)=1.5,srcY=2*(2/4)=1 srcX=3(2/4)=1.5srcY=2(2/4)=1
故?处的像素应该为原图像中的 ( 1.5 , 1 ) (1.5,1) (1.5,1)像素的值,但是像素坐标没有小数,一般采用四舍五入取最邻,所以最终的结果为 ( 2 , 1 ) (2,1) (2,1),对应原图像的橙色。
其他类比得到放大后的图像:
在这里插入图片描述

f=imread('lena.jpg');
N=0.8;
[row,col,color]=size(f);
row_n=round(row*N);%行取整函数
col_n=round(col*N);%列取整函数
%新图像初始化
fnew=zeros(row_n,col_n,color,class(f));
%采用最近邻放缩
%使用class获得原图像的数据类型,使得新图像数据类型与原图像保持一致
for i=1:row_n
    for j=1:col_n
        for n=1:color
            m=round(i/N);%对应原理中的公式
            k=round(j/N);%m,k为新像素点
            if m<1%处理不理想值的情况
                m=1;
            end
            if k<1
                k=1;
            end
            if m>row
                m=row;
            end
            if k>col
                k=col;
            end
            fnew(i,j,n)=f(m,k,n);
        end
    end
end
figure;
imshow(f);
title('原图');
figure;
imshow(fnew)
title('缩小后的图片');

在这里插入图片描述
在这里插入图片描述

双线性插值

根据待求点P相邻最近4个点的像素值,计算出P点的像素值。
在这里插入图片描述
已知Q12,Q22,Q11,Q21,但是要插值的点为P点,这就要用双线性插值了,首先在x轴方向上,对R1和R2两个点进行插值,这个很简单,然后根据R1和R2对P点进行插值,这就是所谓的双线性插值。
在这里插入图片描述
得到P点的像素 f(x, y)

clear
f=imread('lena.jpg');
N=0.8;
[row,col,color]=size(f);
row_n=round(row*N);%行取整函数
col_n=round(col*N);%列取整函数
%新图像初始化
fnew=zeros(row_n,col_n,color,class(f));
%采用双线性放缩
%使用class获得原图像的数据类型,使得新图像数据类型与原图像保持一致
for i=1:row_n
    for j=1:col_n
        for n=1:color
            m=round(i/N);%对应原理中的公式
            k=round(j/N);%m,k为新像素点
            s=m+1;
            q=k+1;
            %处理不理想值的情况
            if m<1
                m=1;
            end
            if k<1
                k=1;
            end
            if m>row
                m=row;
            end
            if k>col
                k=col;
            end
            if s>row
                m=row-1;
            end
            if q>row;
                k=col-1;
            end
            u = i/N-floor(i/N); %求取水平方向上的权重
            v = j/N-floor(j/N); %求取垂直方向上的权重

            fnew(i,j,n) = u*v*f(m,k,n)+(1-u)*v*f(m+1,k,n)+u*(1-v)*f(m,k+1,n)+(1-u)*(1-v)*f(m+1,k+1,n);
            
        end
    end
end
figure;
imshow(f);
title('原图');
figure;
imshow(fnew)
title('缩小后的图片');

在这里插入图片描述
在这里插入图片描述

双三次插值

参考博客

在这种方法中,插值点 (x, y) 的像素灰度值 f(x, y) 通过矩形网格中 最近的十六个采样点的加权平均 得到,而 各采样点的权重由该点到待求插值点的距离确定,此距离包括 水平和竖直 两个方向上的距离。
在这里插入图片描述

上图是一个二维图像的双三次插值俯视示意图。设待求插值点坐标为 (i+u, j+v),已知其周围的 16 个像素坐标点 (网格) 的灰度值,还需要计算 16 个点各自的权重。
以像素坐标点 (i, j) 为例,因为该点在 y 轴和 x 轴方向上与待求插值点 (i+u, j+v) 的距离分别为 u 和 v,所以的权重为 w(u) × w(v),其中 w(·) 是插值权重核 (可以理解为定义的权重函数)。
同理可得其余 15 个像素坐标点各自的权重。那么,待求插值点 (i+u, j+v) 的灰度值 f(i+u, j+v) 将通过如下计算得到:

f ( i + u , j + v ) = A × B × C f(i+u,j+v)=A×B×C f(i+u,j+v)=A×B×C
在这里插入图片描述
插值权重核 w(·) 为:

在这里插入图片描述
推荐参考博客
下面的代码争对的是二维图像的双三次插值处理,若加上彩色会有三个通道,在矩阵转置中会比较麻烦,所以这里只用了两个图像通道。

%双三次插值具体实现
clc,clear;
tic; % calculate running time
fff=imread('lena.jpg'); 
ff =rgb2gray(fff);%转化为灰度图像
[row,col]=size(ff);               %将图像隔行隔列抽取元素,得到缩小的图像f
row_n=row/2;
col_n=col/2;
f =zeros(row_n,col_n);
for i=1:row_n
   for j=1:col_n
     f(i,j)=ff(2*i,2*j);
   end
end
 
k=2;                       %设置放大缩小,相对于缩小后图像进行处理

row_n1=round(k*row_n);
col_n1=round(k*col_n);
a=f(1,:);
c=f(row_n,:);             %将待插值图像矩阵前后各扩展两行两列,共扩展四行四列
b=[f(1,1),f(1,1),f(:,1)',f(row_n,1),f(row_n,1)];
d=[f(1,col_n),f(1,col_n),f(:,col_n)',f(row_n,col_n),f(row_n,col_n)];
a1=[a;a;f;c;c];
b1=[b;b;a1';d;d];
f1=double(b1');
fnew =zeros(row_n1,col_n1);
for i=1:row_n1                 %利用双三次插值公式对新图象所有像素赋值
    u=rem(i,k)/k;
    i1=floor(i/k)+2;
    A=[sw(1+u) sw(u) sw(1-u) sw(2-u)];  
  for j=1:col_n1
     v=rem(j,k)/k;
     j1=floor(j/k)+2;
     C=[sw(1+v);sw(v);sw(1-v);sw(2-v)];
     B=[f1(i1-1,j1-1) f1(i1-1,j1) f1(i1-1,j1+1) f1(i1-1,j1+2)
       f1(i1,j1-1)   f1(i1,j1)  f1(i1,j1+1)   f1(i1,j1+2)
       f1(i1+1,j1-1)   f1(i1+1,j1) f1(i1+1,j1+1) f1(i1+1,j1+2)
       f1(i1+2,j1-1) f1(i1+2,j1) f1(i1+2,j1+1) f1(i1+2,j1+2)];
     fnew(i,j)=(A*B*C);
   end
end
gfnew=uint8(fnew); 

figure,imshow(uint8(f));title('缩小的图像');             %显示缩小的图像 
figure,imshow(ff);title('原图');               %显示原图像
figure,imshow(gfnew);title('双三次插值放大的图像');     %显示插值后的图像
toc;

在这里插入图片描述

历时 1.267243 秒。

在这里插入图片描述

总结

最近邻内插简单但容易产生不想要的人为失真,如严重的直边失真。
双线性内插的结构比最近邻结果好很多,由4个最近邻的像素得出,但计算量随之增大。
复杂度最高的是双三次内插,由16个最近邻的像素得出,但花费时间会更久。

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

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

相关文章

40.java-单列集合Set(HashSet,LinkedHashSet,TreeSet)

Set集合 1.Set集合特点2.Set集合实现类3. HashSet3.1 底层原理3.1.1 哈希表组成3.1.2 哈希值3.1.3 对象的哈希值特点 3.2 数据添加元素的过程3.3 HashSet的三个问题3.4 实例&#xff1a;去除重复元素 4. LinkedHashSet5. TreeSet5.1 特点5.2 集合默认规则5.3 例子5.4 两种比较规…

泛型——List 优于数组

数组与泛型有很大的不同&#xff1a; 1. 数组是协变的&#xff08;covariant&#xff09; 意思是&#xff1a;如果Sub是Super的子类型&#xff0c;则数组类型Sub[] 是数组类型Super[] 的子类型。 2. 泛型是不变的&#xff08;invariant&#xff09; 对于任何两种不同的类型Ty…

Linux下进程间通信

Linux下进程间通信 进程间通信的目的进程间通信的手段的分类管道什么是管道管道原理匿名管道创建匿名管道文件匿名管道的特点匿名管道的4种场景 有名管道有名管道的创建有名管道总结命名管道的打开规则 system V 共享内存共享内存原理建立通信回收共享内存开始通信命令操作共享…

常用的JVM参数选项

目录 打印设置的XX选项及值 堆、栈、方法区等内存大小设置 OutOfMemory相关的选项 垃圾收集器相关选项 GC日志相关选项 其他参数 通过Java代码获取JVM参数 打印设置的XX选项及值 程序运行时JVM默认设置或用户手动设置的XX选项 -XX:PrintCommandLineFlags 打印所有…

Photoshop如何使用绘画和图像修饰之实例演示?

文章目录 0.引言1.给图像添加渐变色效果2.快速创建一副素描画3.清除图像中多余的景物4.快速融合两张图像5.调整图像光影6.人像面部瑕疵修除7.美化眼睛 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对PS进行了学习&#xff0c;本文通过《Photoshop2021入门教程》及其…

LeetCode 与组合数相关的题目

216. 组合总和 III 方法&#xff1a;递归 class Solution { private:vector<vector<int>> res;vector<int> path;void solve(int k, int goal, int cur, int idx) {if (cur > goal) return;if (path.size() k) {if (cur goal) res.push_back(path);re…

小球下落(dropping balls)uva679

题目描述 原文链接 题目链接 上面中文总结一下&#xff1a; D代表这棵树深度&#xff0c;那么一共就有2^d -1 个结点 每个结点从左到右&#xff0c;从上往下&#xff0c;从1开始递增编号&#xff0c;那么也就是说对于结点k来说&#xff0c;左子结点与右子结点的编号分别为…

C/C++每日一练(20230430)

目录 1. 分割回文串 &#x1f31f;&#x1f31f; 2. 六角填数 ※ 3. 查找书籍 &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 分割回文串 给你一个字符串 s&#x…

unity 渲染性能分析工具

目标 既然要优化&#xff0c;肯定要有个目标&#xff1a; pc上一般要求&#xff1a;一秒渲染60帧 移动端&#xff1a;一秒渲染30帧 这应该是最低的要求&#xff0c;如果游戏运行时&#xff0c;游戏帧率有变化&#xff0c;人眼能够明显的感觉到帧率下降。 优化的首要规则是找到…

CMake | 01 - CMake快速上手(3.26.3)

专栏介绍 本专栏记录了博主入门CMake的笔记。 源码仓库欢迎Star&#xff1a;https://github.com/Mculover666/cmake_study。 一、CMake概述 1. 什么是CMake CMake官网&#xff1a;https://cmake.org/ CMake is an open-source, cross-platform family of tools designed t…

17.计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度

说明书 MATLAB代码&#xff1a;计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度 关键词&#xff1a;碳捕集 虚拟电厂 需求响应 优化调度 电转气协同调度 参考文档&#xff1a;《计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度》完全复现 仿真平台&#xff1a…

【Linux从入门到精通】vim的基本使用各种操作详解

文章目录 一、vim编辑器简单介绍 二、vim编辑器的四种模式 2、1 正常/普通/命令模式(Normal mode) 2、2 插入模式(Insert mode) 2、3 末行模式(last line mode) 三、命令模式的相关操作实例 3、1 光标的相关操作 3、2 文本操作 四、插入模式下的相关操作 五、末行模式下的相关操…

FreeRTOS任务的创建(动态方法和静态方法)

文章目录 前言一、FreeRTOS任务基本概念二、动态创建任务三、静态创建任务四、静态创建任务和动态创建任务的区别五、任务的删除总结 前言 本篇文章将介绍FreeRTOS任务的创建&#xff08;动态方法和静态方法&#xff09;&#xff0c;了解什么是任务和任务的具体创建方法。 一…

文件 IO 操作

文章目录 一 文件1.1 文本模式1.2 二进制模式 二 函数2.1fopen()2.2 getc() 和 putc()2.3 fclose()2.4 fprintf() 和 fscanf()2.5 fgets() 和 fputs()2.6 rewind()2.7 fseek() 和 ftell()2.8 fflush()2.9 fgetpos() 和 fsetpos()2.10 feof() 和 ferror()2.11 ungetc()2.12 setv…

[python][vpython]用vpython实现小球砸弹簧代码

代码&#xff1a; from vpython import * # 加载vpython模块s1 canvas(width1200, height500, backgroundcolor.white, centervector(0, 1, 0)) # 定义画布 L0 1.4 # 定义初始高度 natural_length 0.9 # 设置弹簧原长 base_spring box(posvector(0, 0, 0), sizevector…

solidity 安全 如何阻止重入攻击

什么是可重入攻击&#xff1f; 我们使用合约的过程中&#xff0c;经常会遇到这种情况&#xff0c;智能合约能够调用外部的合约&#xff1b;这些外部合约又可以回调到调用他们的智能合约&#xff1b;在这种情况下&#xff0c;我们说智能合约被重新输入&#xff0c;这种情况被称为…

守护进程Daemon

进程组、对话期和控制终端关系 每个会话有且只有一个前台进程组&#xff0c;但会有0个或者多个后台进程组。产生在控制终端上的输入&#xff08;Input&#xff09;和信号&#xff08;Signal&#xff09;将发送给会话的前台进程组中的所有进程。对于输出&#xff08;Output&…

给大家介绍几个手机冷门但好用的小技巧

技巧一&#xff1a;拍照识别植物 手机的拍照识别植物功能是指在使用手机相机时&#xff0c;可以通过对植物进行拍照&#xff0c;并通过植物识别技术&#xff0c;获取植物的相关信息和资料。其主要优点如下&#xff1a; 方便实用&#xff1a;使用拍照识别植物功能&#xff0c;…

Small Tip: 怎么去Schedule一个Analysis for Office的workbook

workbook的query不能是本地的&#xff0c;也就是说不能是在包$Tmp里面的。这种的没办法在BO里面用SSO。也就没办法Schedule。 前提条件有&#xff1a; 1.BO和BW系统的SSO配置得OK。 如果没有SSO&#xff0c;那么每次打开workbook就会有一个要登录BW的弹窗&#xff0c;这样是…

从零开始学习Linux运维,成为IT领域翘楚(三)

文章目录 &#x1f525;Linux超级用户与伪用户&#x1f525;Linux文件基本属性&#x1f525;Linux权限字与权限操作 &#x1f525;Linux超级用户与伪用户 Linux下用户分为三类&#xff1a;超级用户、普通用户、伪用户 ⭐ 超级用户&#xff1a;用户名为root&#xff0c;具有一切…