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获取图片颜色信息的方法
Mar 18 Python
python中反射用法实例
Mar 27 Python
python发送HTTP请求的方法小结
Jul 08 Python
Python的装饰器用法学习笔记
Jun 24 Python
Python获取文件所在目录和文件名的方法
Jan 12 Python
win7上python2.7连接mysql数据库的方法
Jan 14 Python
Python线性回归实战分析
Feb 01 Python
python中验证码连通域分割的方法详解
Jun 04 Python
Python实现的简单读写csv文件操作示例
Jul 12 Python
python从入门到精通 windows安装python图文教程
May 18 Python
pygame实现烟雨蒙蒙下彩虹雨
Nov 11 Python
使用python操作lmdb对数据读取的实例
Dec 11 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
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
一步一步学习PHP(7) php 字符串相关应用
2010/03/05 PHP
PHP 验证码的实现代码
2011/07/17 PHP
PHP转换IP地址到真实地址的方法详解
2013/06/09 PHP
laravel 操作数据库常用函数的返回值方法
2019/10/11 PHP
JavaScript入门之基本函数详解
2011/10/21 Javascript
jquery ajax的success回调函数中实现按钮置灰倒计时
2013/11/19 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
JQuery标签页效果实例详解
2015/12/24 Javascript
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
大型JavaScript应用程序架构设计模式
2016/06/29 Javascript
javaScript实现复选框全选反选事件详解
2020/11/20 Javascript
js实现动态改变radio状态的方法
2018/02/28 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
微信小程序自定义tabBar的踩坑实践记录
2020/11/06 Javascript
python实现爬虫下载漫画示例
2014/02/16 Python
Python判断字符串与大小写转换
2015/06/08 Python
Python ftp上传文件
2016/02/13 Python
Python实现ssh批量登录并执行命令
2016/10/25 Python
解决python爬虫中有中文的url问题
2018/05/11 Python
python代码 输入数字使其反向输出的方法
2018/12/22 Python
HTML5实现的震撼3D焦点图动画的示例代码
2019/09/26 HTML / CSS
HTML5 canvas基本绘图之绘制线条
2016/06/27 HTML / CSS
快速实现一个简单的canvas迷宫游戏的示例
2018/07/04 HTML / CSS
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
viagogo波兰票务平台:演唱会、体育比赛、戏剧门票
2018/04/23 全球购物
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
Java平台和其他软件平台有什么不同
2015/06/05 面试题
11月升旗仪式讲话稿
2014/02/15 职场文书
天地会口号
2014/06/17 职场文书
哈姆雷特读书笔记
2015/06/29 职场文书
金榜题名主持词
2015/07/02 职场文书
小学生教师节广播稿
2015/08/19 职场文书
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python
python基础入门之普通操作与函数(三)
2021/06/13 Python