1. 程式人生 > 程式設計 >python 影象插值 最近鄰、雙線性、雙三次例項

python 影象插值 最近鄰、雙線性、雙三次例項

最近鄰:

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,channels =img.shape
 emptyImage=np.zeros((m,n,np.uint8)
 value=[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)
cv2.imshow("Bilinear Interpolation",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,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],y+1],y+1]],[img[x,img[x,y+2]],[img[x+1,img[x+1,[img[x+2,img[x+2,])
    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,1]),0]
    red = np.dot(np.dot(A,2]),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",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 影象插值 最近鄰、雙線性、雙三次例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。