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

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个最近邻的像素得出,但花费时间会更久。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue核心 列表渲染 数据监视

1.13.列表渲染 1.13.1.基本列表 v-for指令 用于展示列表数据语法&#xff1a;&#xff0c;这里key可以是index&#xff0c;更好的是遍历对象的唯一标识可遍历&#xff1a;数组、对象、字符串&#xff08;用的少&#xff09;、指定次数&#xff08;用的少&#xff09; <!…

Kubesphere流水线实现蓝绿发布

Kubesphere流水线实现蓝绿发布 1. Gitlab仓库准备 1.1 创建仓库 新建空白项目,名字随便取 greenweb复制克隆地址 http://192.168.31.199/deploy/greenweb.git1.2 初始化并上传代码 克隆并初始化代码仓库 mkdir git cd git git clone http://192.168.31.199/deploy/green…

【嵌入式烧录刷写文件】-2.3-删除/修改Intel Hex文件中指定地址范围内的数据

案例背景&#xff08;共6页精讲&#xff09;&#xff1a; 有如下一段HEX文件&#xff0c;如何“自动”地完成地址范围0x9110-0x9113数据的删除或修改。 :2091000058595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576775F :2091200078797A7B7C7D7E7F808182838485…

一觉醒来Chat gpt就被淘汰了

目录 什么是Auto GPT&#xff1f; 与其他语言生成模型相比&#xff0c;Auto GPT具有以下优点 Auto GPT的能力 Auto GPT的能力非常强大&#xff0c;它可以应用于各种文本生成场景&#xff0c;包括但不限于以下几个方面 Auto GPT的历史 马斯克说&#xff1a;“ChatGPT 好得吓…

记csdn打不开或打开缓慢后的修复--如何查找dns并修改hosts文件

记csdn打开缓慢后的修复–如何查找dns并修改hosts文件 问题&#xff1a; CSDN文章打开的十分缓慢&#xff0c;经常出现无法打开页面的错误提示 &#xff08;以前用的好好的&#xff0c;现在不知道公司局域网改了什么东西&#xff0c;导致我的电脑打开CSDN经常缓慢好久&#x…

Lesson14 高级IO

前言 IO 等待 数据拷贝,比如read/recv,write/send只要在单位事件里,让等的比重减低,IO的效率就越高 五种IO模型 钓鱼小案例 阻塞式 阻塞式: 张三拿着一根鱼竿,一直在岸边钓鱼,期间一直盯着鱼竿,等待鱼上钩 非阻塞式轮询式 非阻塞式轮询式: 李四拿着一根鱼竿,在岸边钓鱼,期…

Linux共享库、动态库详解

目录 一.静态库 二.动态库 三.静态库的制作与使用 四.动态库的制作与使用 在日常编程中我们不想让别人看到我们写的源码&#xff0c;但还需要发给对方使用&#xff0c;在这种情况下我们引入了静态库动态库&#xff0c;让对方用调库的方式也可以实现我们写的代码的功能&…

Android电源管理介绍

一、电源管理基础知识 1.1电源管理的几种状态 Android kernel源码中&#xff0c;定义了三种电源状态&#xff0c;在kernel/power/suspend.c中&#xff1a; 对应的宏定义/include/linux/suspend.h 1.2 电源管理状态的介绍&#xff1a; PM_SUSPEND_ON 设备处于正常工作状态 …

vue2 框架运行原理剖析系列(一)之 new Vue()实例化过程到底做了什么!!!

一、vue 基础用法 1.1 引入vue 1.2 使用vue语法编写ui 1.3 实现数据绑定 示例代码如下 <div id"app">{{ message }} </div> <script> var app new Vue({el: #app,data: {message: Hello Vue!} }) </script>1.4 代码效果&#xff1a;使用浏…

Nessus 10.5 Auto Install for macOS Ventura(自动化安装 Nessus 试用版)

发布 Nessus 试用版自动化安装程序&#xff0c;支持 macOS Ventura、RHEL 9 和 Ubuntu 22.04 请访问原文链接&#xff1a;https://sysin.org/blog/nessus-auto-install-for-macos/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.o…

js实现产品页点击小图在大图区显示

企业网站产品图片可能会比较多&#xff0c;需要在产品页面多放几张展示图片&#xff0c;我们可以使用一张大图几张小图的形式排列&#xff0c;并使用js代码实现点击小图显示大图。效果如下所示 html代码部分&#xff1a; <div class"img_bd"> <img src"…

linux0.12-8-7-signal.c

[334页] (-:这一小节很难理解。但我基本都理解了&#xff0c;哈哈。 1、为什么signal不可靠&#xff0c;而sigaction可靠&#xff1b; 2、 为什么系统调用会被打断&#xff1f; 3、 sys_signal&#xff0c;sys_sigaction&#xff0c;函数作用&#xff1f; 4、 do_signal&#x…

IDEA中java文件出现黄色的J文件同时maven项目导入了依赖但是idea依赖加不进去的问题记录

IDEA导入项目后依赖jar包没有显示 报错提示尝试的解决方法检查对应的sdkmodule等配置信息开始尝试是不是版本问题&#xff0c;因为对上述maven报错进行查询&#xff0c;好像是因为版本太高导致的&#xff0c;开始下一个低版本进行尝试切换版本即可解决 总结后续出现的BUG 此次环…

【C++的类与对象(下)】

目录 一、细说构造函数1.1初始化列表的引入1.2初始化列表1.2关键字explicit 二、static成员2.1static成员的特性2.2题目&#xff1a;实现一个类&#xff0c;计算程序中创建出了多少个类对象2.3题目&#xff1a;设计一个类 只能再栈上或者堆上创建 一、细说构造函数 1.1初始化列…

buuctf8

目录 crypto 摩丝 password 变异凯撒 Quoted-printable Rabbit web [护网杯 2018]easy_tornado [HCTF 2018]admin misc 被劫持的神秘礼物​编辑 crypto 摩丝 下载文件&#xff0c;得到一串摩斯密码 在线解码 password 下载文件 张三英文zs&#xff0c;加上生日&a…

【语义分割】标注工具ISAT with segment anything介绍

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 极速分割标注工具 1. 正文 1.1 安装 创建虚拟环境 conda create -n ISAT_with_segment_anything python3.8 conda activate ISAT_with_segment_anyt…

前端011_标签模块_列表功能

标签模块_列表功能 1、需求分析2、Mock添加数据列表模拟接口3、Api调用接口4、列表模版5、分页查询实现1、需求分析 标签模块主要文章标签进行管理,类别和标签的关系是一对多,一个类别下面存在多个标签。 首先开发模块中的列表功能,包含数据列表、分页。 2、Mock添加数据…

记录--前端实现点击选词功能

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 今天有一个需求&#xff0c;点击选中某个英文单词&#xff0c;然后对这个单词做一些处理&#xff0c;例如高亮背景、查看一些详细信息等等&#xff0c;今天简单实现了一下&#xff0c;效果如下&#x…

性能测试的核心原理

性能测试的核心原理 1 基于协议&#xff0c;前后端交互机制&#xff0c;性能核心。基于界面决定和前端用户交互&#xff0c;基于代码决定了后端。 1 网络分布式架构。 2 单机应用&#xff0c;比如安安兔&#xff0c;鲁大师。主要判断io读写&#xff0c;以及对资源的消耗。 2 多…

搭建本地仓库源

一、如何搭建仓库源 之前讲了定制ISO的方法&#xff1a;使用chroot定制系统&#xff0c;但有时候我们想自定义的安装包不在上游的仓库源中&#xff0c;在我们本地应该怎么办呢&#xff1f;如果我们将deb包拷贝到iso目录再安装有点过于麻烦了&#xff0c;而且还可能需要手动处理…