前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >原-图像处理基础(二)图像的放大与缩小

原-图像处理基础(二)图像的放大与缩小

作者头像
Pulsar-V
发布于 2018-04-28 05:40:30
发布于 2018-04-28 05:40:30
3K00
代码可运行
举报
文章被收录于专栏:Pulsar-VPulsar-V
运行总次数:0
代码可运行

最近邻插值法

其中

  • size(g(x))代表图像像素矩阵列宽
  • size(g(y))代表图像像素矩阵行高
  • scale 代表缩放倍数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
\begin{matrix} 
f(x)=g(round(x),round(y)) \\ 
 round(x)=\frac {size(g(x))}{ scale}\\
 round(y)=\frac {size(g(y))}{ scale}\\
\end{matrix}

Matlab代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%输入参数 源图像,放大倍数
function dst=imageNearestNeighbor(src,scale)
Row=size(src,1);  
Col=size(src,2);%图像行数和列数  
max_row=round(scale*Row);%求出变换后的坐标的最大值  
max_col=round(scale*Col);  
B=zeros(max_row,max_col,3);%定义变换后的图像  3表示3个通道(RGB)
for new_row=1:max_row
  for new_col=1:max_col
     x=round(new_row/scale);  
     y=round(new_col/scale);%最小临近法对图像进行插值  
     %处理边缘  
     if x==0 x=1;end  
     if y==0 y=1;end  
     if x>Row x=Row;end  %溢出处理
     if y>Col y=Col;end  %溢出处理
     B(i,j,:)=A(x,y,:);  %B(i,j)像素点对应A最近邻点A(x,y)
   end  
end  
B=uint8(B);%将矩阵转换成8位无符号整数   

OpenCV代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//待更新

双线性插值

Matlab代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%采用双线性内插值对图像进行缩放处理
%参数n表示缩放的倍数
function []=scale2(n)
ima=imread('test.jpg'); %读取原图像
ima=double(ima); %二维矩阵转为双精度类型
swh=size(ima); %获取原图像的宽高
sh=swh(:,1); %获取原图像的高
sw=swh(:,2); %获取原图像的宽
 
%"加墙"
ima2=zeros(sh+2,sw+2);
ima2(1,2:sw+1)=ima(1,:); %原图像上边加墙,灰度值与边界一致
ima2(sh+2,2:sw+1)=ima(sh,:); %原图像下边加墙,灰度值与边界一致
ima2(2:sh+1,2:sw+1)=ima; %将原图像赋值给中心部分
ima2(:,1)=ima2(:,2); %原图像左边加墙,灰度值与边界一致
ima2(:,sw+2)=ima2(:,sw+1); %原图像右边加墙,灰度值与边界一致
 
dw=sw*n; %计算缩放后的图像的宽
dh=sh*n; %计算缩放后的图像的高
 
dw1=round((sw+2)*n); %计算加墙后缩放的图像的宽
dh1=round((sh+2)*n); %计算加墙后缩放的图像的高
 
resIma1=zeros(dh1,dw1); %创建原图像的矩阵
 
%从不是“墙”的位置开始计算缩放后的图像的各点灰度值
%考虑缩小图像时,输入的缩放倍数是小数,需进行取整
start=round(n+1);
endI=round(dh+n);
endJ=round(dw+n);
 
for i=start:endI
    for j=start:endJ
        tx=i/n; %缩放后的图像坐标在原图像处的位置
        ty=j/n;
        tdx=tx-floor(tx); %得到小数坐标
        tdy=ty-floor(ty);
        %确定临近四个角的坐标
        %Q11Q11x=tx-tdx;
        Q11y=ty-tdy;
        %Q12Q12x=tx-tdx;
        Q12y=Q11y+1;
        %Q21Q21x=Q11x+1;
        Q21y=Q11y;
        %Q22Q22x=Q11x+1;
        Q22y=Q11y+1;
        %根据双线性内插算法,算出缩放后的图像在(i,j)点处的灰度值
        resIma1(i,j)=tdx*tdy*ima2(Q11x,Q11y)+(1-tdx)*tdy*ima2(Q12x,Q12y)+tdx*(1-tdy)*ima2(Q21x,Q21y)+(1-tdy)*(1-tdx)*ima2(Q22x,Q22y);
    end
end
resIma=resIma1(n+1:dh+n,n+1:dw+n); %截取除墙外的中心部分
resIma=uint8(resIma);
imshow(resIma); %显示缩放后的图像
end

OpenCV 代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//待填坑

**附上一道很经典的 双线性插值 面试题 ** 已知Q12,Q22,Q11,Q21的坐标如图1,求P点的坐标

双三次插值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//笔者编程能力有限,待笔者好好研究研究。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Vue学习-学习源码手撸简易Vue
本期内容是带着大家熟悉 Vue 的基本组成逻辑,并手把手的帮助大家完成一个简易版本的 Vue。
Caleb
2020/12/14
7820
Vue学习-学习源码手撸简易Vue
实现简易的 Vue 响应式
我们首先封装一个响应式处理的方法 defineReactive,通过 defineProperty 这个方法重新定义对象属性的 get 和 set 描述符,来实现对数据的劫持,每次 读取数据 的时候都会触发 get ,每次 更新数据 的时候都会触发 set ,所以我们可以在 set 中触发更新视图的方法 update 来实现一个基本的响应式处理。
PHP开发工程师
2022/03/23
4630
实现简易的 Vue 响应式
耽误你的十分钟,让MVVM原理还给你
众所周知当下是MVVM盛行的时代,从早期的Angular到现在的React和Vue,再从最初的三分天下到现在的两虎相争。
Nealyang
2019/09/29
1.1K0
耽误你的十分钟,让MVVM原理还给你
~<Strong>-要-模-拟</Strong> Vue 响应式原理
https://juejin.cn/post/6946120511713705992
zz_jesse
2021/05/07
4910
Vue.js 2 深入理解
含了父作用域中不作为 prop 被识别(且获取)的特性绑定(class 和 style 除外)
Cellinlab
2023/05/17
1.2K0
Vue.js 2 深入理解
一比一手写迷你版vue,彻底搞懂vue运行机制
现在前端面试Vue中都会问到响应式原理以及如何实现的,如果你还只是简单回答通过Object.defineProperty()来劫持属性可能已经不够了。
hellocoder2029
2022/09/26
6990
浅析Vue响应系统原理与搭建Vue2.x迷你版
数据模型仅仅是普通的JavaScript对象,而当我们修改数据时,视图会进行更新,避免了繁琐的DOM操作,提高开发效率。简言之,在改变数据的时候,视图会跟着更新。
Vam的金豆之路
2021/12/01
3560
浅析Vue响应系统原理与搭建Vue2.x迷你版
滴滴前端一面常考手写面试题合集2
setInterval 的作用是每隔一段指定时间执行一个函数,但是这个执行不是真的到了时间立即执行,它真正的作用是每隔一段时间将事件加入事件队列中去,只有当当前的执行栈为空的时候,才能去从事件队列中取出事件执行。所以可能会出现这样的情况,就是当前执行栈执行的时间很长,导致事件队列里边积累多个定时器加入的事件,当执行栈结束的时候,这些事件会依次执行,因此就不能到间隔一段时间执行的效果。
helloworld1024
2023/01/04
8400
实现一个简单版 Vue2 双向数据绑定
实现一个简单版本 Vue,仅实现了 数据响应式、依赖收集、compile编译中的html和文本编译,起名为nvue,即新 vue。
蓓蕾心晴
2022/09/24
2160
实现一个简单版 Vue2 双向数据绑定
vue 随记(2):轮子是如何造成的
为了预测恒纪元和乱纪元,故事里的冯诺依曼设计了人列计算机,不需要三千万个数学家。只需要三千万忠实的士兵,每个个体订阅相关单元的变化,忠实地反映状态即可。
一粒小麦
2020/07/16
8440
从源码角度说清楚MVVM!实现v-model!真的很简单!
对于不是很了解设计模式的朋友,你可以先理解一下单向数据绑定,就是把数据绑定到视图,每次触发操作修改了数据,视图就会更新,数据 -> 视图,可以理解为MV,数据驱动视图。
HoMeTown
2022/10/26
4610
从源码角度说清楚MVVM!实现v-model!真的很简单!
实现vue的mvvm
vue2实现mvvm原理 数据劫持 主要通过 Object.defineProperty() 这个方法实现 发布订阅模式(观察者模式) html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <bo
hss
2022/02/25
2820
实现 Vue 的响应式系统
Vue 最独特的特性之一,是其非侵入性的响应式系统。比如我们修改了数据,那么依赖这些数据的视图都会进行更新,大大提高了我们的"搬砖"效率,回想一下初学 JS 的时候海量的 Dom操作.......,Vue 通过数据驱动视图,极大的将我们从繁琐的DOM操作中解放出来。
前端小tips
2021/11/26
5130
实现 Vue 的响应式系统
彻底明白vue双向绑定底层原理(源码分析)
vue是一个mvvm框架,双向绑定是vue的一个核心功能,所谓双向绑定就是当试图发生改变的时候传递给VM(ViewModel ),让数据得到更新,当数据发生改变的时候传给VM(ViewModel ),使得视图发生变化!概念都知道,但是vue怎么做到的呢?看下面的一张图(图是搬运别人的)
全栈程序员站长
2022/10/05
7720
彻底明白vue双向绑定底层原理(源码分析)
vue.js响应式原理解析与实现—实现v-model与{{}}指令
上一节我们已经分析了vue.js是通过Object.defineProperty以及发布订阅模式来进行数据劫持和监听,并且实现了一个简单的demo。今天,我们就基于上一节的代码,来实现一个MVVM类,将其与html结合在一起,并且实现v-model以及{{}}语法。
嘿嘿嘿
2018/09/10
1.9K0
前端高频手写面试题总结
输入字符串s,以及其重复的次数,输出重复的结果,例如输入abc,2,输出abcabc。
helloworld1024
2022/12/12
2.3K0
滴滴前端一面常考手写面试题整理_2023-03-01
类数组是具有length属性,但不具有数组原型上的方法。常见的类数组有arguments、DOM操作方法返回的结果。
用户10358576
2023/03/01
1.8K0
vue的双向绑定原理及实现_vue绑定数据
单向绑定非常简单,就是把Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新
全栈程序员站长
2022/10/05
1.6K0
vue的双向绑定原理及实现_vue绑定数据
从零到一手写迷你版Vue
CVue:自定义Vue类 Observer:执⾏数据响应化(分辨数据是对象还是数组) Compile:编译模板,初始化视图,收集依赖(更新函数、 watcher创建) Watcher:执⾏更新函数(更新dom) Dep:管理多个Watcher实例,批量更新
helloworld1024
2022/10/18
5760
深入理解vue2.x双向数据绑定原理
在面试中会经常问到vue2.x双向数据绑定是怎么实现的,大多数面试者都会回答Object.defineProperty()方法对属性进行拦截,把data中的每个数据的读写都转化成getter/setter,当数据发生变化时候通知试图进行更新。本文将详细论述双向数据绑定的原理是怎么实现。
can4hou6joeng4
2023/11/29
2120
推荐阅读
相关推荐
Vue学习-学习源码手撸简易Vue
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验