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

作者:cc0587 时间:2023-01-09 07:48:56 

最近邻:


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);

来源:https://blog.csdn.net/u010096025/article/details/53780623

标签:python,最近邻,双线性,双三次
0
投稿

猜你喜欢

  • 6个网站改版时需要注意的问题

    2010-02-26 10:47:00
  • 如何解决因使用On Error Resume Next导致错误不正确的问题?

    2009-12-16 18:34:00
  • python 矩阵增加一行或一列的实例

    2023-02-16 20:19:29
  • 深入认识javascript中的eval函数

    2008-08-03 16:44:00
  • 用Python编写简单的微博爬虫

    2022-10-07 04:58:34
  • python opencv之SURF算法示例

    2021-03-06 13:10:28
  • 深入探讨SQL Server 2008商务智能(BI)

    2008-12-23 13:56:00
  • pandas统计重复值次数的方法实现

    2022-11-09 03:27:58
  • Java使用JDBC连接数据库的详细步骤

    2024-01-15 17:42:42
  • python-pymysql获取字段名称-获取内容方式

    2024-01-21 05:19:44
  • 一百行python代码将图片转成字符画

    2023-05-06 05:49:15
  • Django使用HTTP协议向服务器传参方式小结

    2023-03-08 11:31:20
  • 阿里云服务器新建用户具体方法

    2024-01-22 19:08:51
  • Python正则抓取新闻标题和链接的方法示例

    2022-05-16 06:01:31
  • 详解设计模式中的工厂方法模式在Python程序中的运用

    2022-11-14 01:06:58
  • python 实现图片裁剪小工具

    2022-04-27 18:15:15
  • "模板化"——限制还是激发

    2009-03-26 11:36:00
  • python使用jieba实现中文分词去停用词方法示例

    2021-02-04 11:27:17
  • Python随机数模块详情

    2021-10-26 06:47:34
  • 设计较好付款流程的12个建议

    2009-06-08 12:45:00
  • asp之家 网络编程 m.aspxhome.com