python 图像插值 最近邻、双线性、双三次实例


Posted in Python onJuly 05, 2020

最近邻:

import cv2
import numpy as np
def function(img):
 height,width,channels =img.shape
 emptyImage=np.zeros((2048,2048,channels),np.uint8)
 sh=2048/height
 sw=2048/width
 for i in range(2048):
  for j in range(2048):
   x=int(i/sh)
   y=int(j/sw)
   emptyImage[i,j]=img[x,y]
 return emptyImage
 
img=cv2.imread("e:\\lena.bmp")
zoom=function(img)
cv2.imshow("nearest neighbor",zoom)
cv2.imshow("image",img)
cv2.waitKey(0)

双线性:

import cv2
import numpy as np
import math
def function(img,m,n):
 height,width,channels =img.shape
 emptyImage=np.zeros((m,n,channels),np.uint8)
 value=[0,0,0]
 sh=m/height
 sw=n/width
 for i in range(m):
  for j in range(n):
   x = i/sh
   y = j/sw
   p=(i+0.0)/sh-x
   q=(j+0.0)/sw-y
   x=int(x)-1
   y=int(y)-1
   for k in range(3):
    if x+1<m and y+1<n:
     value[k]=int(img[x,y][k]*(1-p)*(1-q)+img[x,y+1][k]*q*(1-p)+img[x+1,y][k]*(1-q)*p+img[x+1,y+1][k]*p*q)
   emptyImage[i, j] = (value[0], value[1], value[2])
 return emptyImage
 
img=cv2.imread("e:\\lena.bmp")
zoom=function(img,2048,2048)
cv2.imshow("Bilinear Interpolation",zoom)
cv2.imshow("image",img)
cv2.waitKey(0)

双三次:

import cv2
import numpy as np
import math
 
def S(x):
 x = np.abs(x)
 if 0 <= x < 1:
  return 1 - 2 * x * x + x * x * x
 if 1 <= x < 2:
  return 4 - 8 * x + 5 * x * x - x * x * x
 else:
  return 0
def function(img,m,n):
 height,width,channels =img.shape
 emptyImage=np.zeros((m,n,channels),np.uint8)
 sh=m/height
 sw=n/width
 for i in range(m):
  for j in range(n):
   x = i/sh
   y = j/sw
   p=(i+0.0)/sh-x
   q=(j+0.0)/sw-y
   x=int(x)-2
   y=int(y)-2
   A = np.array([
    [S(1 + p), S(p), S(1 - p), S(2 - p)]
   ])
   if x>=m-3:
    m-1
   if y>=n-3:
    n-1
   if x>=1 and x<=(m-3) and y>=1 and y<=(n-3):
    B = np.array([
     [img[x-1, y-1], img[x-1, y],
      img[x-1, y+1],
      img[x-1, y+1]],
     [img[x, y-1], img[x, y],
      img[x, y+1], img[x, y+2]],
     [img[x+1, y-1], img[x+1, y],
      img[x+1, y+1], img[x+1, y+2]],
     [img[x+2, y-1], img[x+2, y],
      img[x+2, y+1], img[x+2, y+1]],
 
     ])
    C = np.array([
     [S(1 + q)],
     [S(q)],
     [S(1 - q)],
     [S(2 - q)]
    ])
    blue = np.dot(np.dot(A, B[:, :, 0]), C)[0, 0]
    green = np.dot(np.dot(A, B[:, :, 1]), C)[0, 0]
    red = np.dot(np.dot(A, B[:, :, 2]), C)[0, 0]
 
    # ajust the value to be in [0,255]
    def adjust(value):
     if value > 255:
      value = 255
     elif value < 0:
      value = 0
     return value
 
    blue = adjust(blue)
    green = adjust(green)
    red = adjust(red)
    emptyImage[i, j] = np.array([blue, green, red], dtype=np.uint8)
 
 return emptyImage
 
img=cv2.imread("e:\\lena.bmp")
zoom=function(img,1024,1024)
cv2.imshow("cubic",zoom)
cv2.imshow("image",img)
cv2.waitKey(0)

补充知识:最邻近插值法(The nearest interpolation)实现图像缩放

也称零阶插值。它输出的像素灰度值就等于距离它映射到的位置最近的输入像素的灰度值。但当图像中包含像素之间灰度级有变化的细微结构时,最邻近算法会在图像中产生人为加工的痕迹。

具体计算方法:对于一个目的坐标,设为 M(x,y),通过向后映射法得到其在原始图像的对应的浮点坐标,设为 m(i+u,j+v),其中 i,j 为正整数,u,v 为大于零小于1的小数(下同),则待求象素灰度的值 f(m)。利用浮点 m 相邻的四个像素求f(m)的值。

function re_im = nearest(im, p, q)
%最邻近插值法,输入目标图像和行缩放、纵缩放倍数
%ziheng 2016.3.27
[m,n] = size(im);
im_R = im(:,:,1);
im_G = im(:,:,2);
im_B = im(:,:,3);
l = round(m*p);
h = round(n*q)/3;
re_R = uint8(zeros(l,h));
re_G = uint8(zeros(l,h));
re_B = uint8(zeros(l,h));
for dstx = 1:l
 for dsty = 1:h
   srcx = max(1,min(m,round(dstx/p)));
   srcy = max(1,min(n/3,round(dsty/q)));
   re_R(dstx,dsty) = im_R(srcx,srcy);
   re_G(dstx,dsty) = im_G(srcx,srcy);
   re_B(dstx,dsty) = im_B(srcx,srcy);
 end
end
re_im = cat(3,re_R,re_G,re_B);
figure,imshow(re_im);

以上这篇python 图像插值 最近邻、双线性、双三次实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python解析xml文件实例分享
Dec 04 Python
Python BeautifulSoup中文乱码问题的2种解决方法
Apr 22 Python
Python对列表去重的多种方法(四种方法)
Dec 05 Python
python3 发送任意文件邮件的实例
Jan 23 Python
python的中异常处理机制
Aug 30 Python
200行python代码实现2048游戏
Jul 17 Python
python中的global关键字的使用方法
Aug 20 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
Python解析json代码实例解析
Nov 25 Python
pytorch 指定gpu训练与多gpu并行训练示例
Dec 31 Python
如何理解python面向对象编程
Jun 01 Python
在python下实现word2vec词向量训练与加载实例
Jun 09 Python
python cv2.resize函数high和width注意事项说明
Jul 05 #Python
Python中flatten( ),matrix.A用法说明
Jul 05 #Python
python线性插值解析
Jul 05 #Python
使用keras实现非线性回归(两种加激活函数的方式)
Jul 05 #Python
Keras 中Leaky ReLU等高级激活函数的用法
Jul 05 #Python
Django --Xadmin 判断登录者身份实例
Jul 03 #Python
详解Python多线程下的list
Jul 03 #Python
You might like
PHP 批量更新网页内容实现代码
2010/01/05 PHP
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
2015/01/07 PHP
php实现将上传word文件转为html的方法
2015/06/03 PHP
ThinkPHP实现递归无级分类――代码少
2015/07/29 PHP
javascript preload&amp;lazy load
2010/05/13 Javascript
js 编程笔记 无名函数
2011/06/28 Javascript
jquery 实现窗口的最大化不论什么情况
2013/09/03 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
2014/08/15 Javascript
jQuery实现ichat在线客服插件
2014/12/29 Javascript
JavaScript创建一个object对象并操作对象属性的用法
2015/03/23 Javascript
使用JavaScript 实现的人脸检测
2015/03/24 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
javaScript代码飘红报错看不懂?读完这篇文章再试试
2020/08/19 Javascript
vue.js watch经常失效的场景与解决方案
2021/01/07 Vue.js
Python os模块介绍
2014/11/30 Python
全面理解Python中self的用法
2016/06/04 Python
Python多层嵌套list的递归处理方法(推荐)
2016/06/08 Python
Python实现Kmeans聚类算法
2020/06/10 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
2018/03/13 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
2018/06/11 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
详解python如何引用包package
2020/06/07 Python
惠普加拿大在线商店:HP加拿大
2017/09/15 全球购物
毕业典礼演讲稿
2014/05/13 职场文书
学年个人总结范文
2015/03/05 职场文书
物业客服专员岗位职责
2015/04/07 职场文书
2015年电教工作总结
2015/05/26 职场文书
护理培训心得体会
2016/01/22 职场文书
Java常用函数式接口总结
2021/06/29 Java/Android
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android
mysql序号rownum行号实现方式
2022/12/24 MySQL