当前位置:   article > 正文

无聊之作-图像插值方法python实现_python取插值后的图像的一段

python取插值后的图像的一段

设原图像大小为(scr_height,scr_width),新图像大小为(dst_height,dst_width),则图像的尺度(放大缩小尺度)scale=dst_height/scr_height=dst_width/scr_width(本文是对xy轴都使用同一scale,不同scale原理相同)

设新图像中的任意一个像素点(dst_x,dst_y),将(dst_x,dst_y)映射回原图像的坐标(x,y)

其中x=dst_x/scale,y=dst_y/scale,可以看到,x和y不可能正好是整数,因此可以将x和y分别整数部分(int_x,int_y)和小数部分(float_x,float_y),几种插值方法只是对于x和y使用不同的处理方法得到新图像的像素点

1、最近邻插值

最近邻插值就是简单的选择x和y的整数部分的坐标像素点赋值给新图像

Idst(dstx,dsty)=Isrc(intx,inty)

  1. def nearest_interpolation(img,scale):
  2. dst_cols = (int)(img.shape[0] * scale)
  3. dst_rows = (int)(img.shape[1] * scale)
  4. img_dst = np.zeros([dst_cols, dst_rows])
  5. for i in range(dst_cols-1):
  6. for j in range(dst_rows-1):
  7. #坐标转换
  8. scr_x=(i+0.5)/scale-0.5
  9. scr_y=(j+0.5)/scale-0.5
  10. # 整数部分
  11. int_x = int(scr_x)
  12. int_y = int(scr_y)
  13. img_dst[i][j]=img[int_x][int_y]
  14. return img_dst
'
运行

 

2、双线性插值

双线性插值就是使用int_x,int_y为左上角的坐标,取右、右下、下一共四个点进行线性插值得到dst的图像值

Idst(dstx,dsty)=(1floatx)(1floaty)Iscr(intx,inty)+(1floatx)floatyIscr(intx,inty+1)+floatx(1floaty)Iscr(intx+1,inty)+floatxfloatyIscr(intx+1,inty+1)

  1. def bilinear_interpolation(img,scale):
  2. dst_cols=(int)(img.shape[0]*scale)
  3. dst_rows=(int)(img.shape[1]*scale)
  4. img_dst=np.zeros([dst_cols,dst_rows])
  5. for i in range(dst_cols-1):
  6. for j in range(dst_rows-1):
  7. #坐标转换
  8. scr_x=(i+0.5)/scale-0.5
  9. scr_y=(j+0.5)/scale-0.5
  10. #整数部分
  11. int_x=int(scr_x)
  12. #小数部分
  13. float_x=scr_x-int_x
  14. int_y=int(scr_y)
  15. float_y=scr_y-int_y
  16. if int_x==img.shape[0]-1:
  17. int_x_p=img.shape[0]-1
  18. else:
  19. int_x_p=int_x+1
  20. if int_y==img.shape[1]-1:
  21. int_y_p=img.shape[1]-1
  22. else:
  23. int_y_p=int_y+1
  24. img_dst[i][j]=(1-float_x)*(1-float_y)*img[int_x][int_y]+(1-float_x)*float_y*img[int_x][int_y_p]+\
  25. float_x*(1-float_y)*img[int_x_p][int_y]+float_x*float_y*img[int_x_p][int_y_p]
  26. return img_dst
'
运行

 

3、双立方插值

双立方插值就是使用int_x,int_y为左上角的坐标,取附近一共16个点进行线性插值得到dst的图像值

Idst(dstx,dsty)=row=12col=12Iscr(intx,inty)S(rowfloatx)S(colfloaty)

其中S为采样公式

  1. def bicubic_interpolation(img,scale):
  2. def s(x,a=-1):
  3. x_abs=math.fabs(x)
  4. if x_abs>=0 and x_abs<=1:
  5. return 1-(a+3)*math.pow(x_abs,2)+(a+2)*math.pow(x_abs,3)
  6. elif x_abs>1 and x_abs<=2:
  7. return -4*a+8*a*x_abs-5*a*math.pow(x_abs,2)+a*math.pow(x_abs,3)
  8. else:
  9. return 0
  10. dst_cols = (int)(img.shape[0] * scale)
  11. dst_rows = (int)(img.shape[1] * scale)
  12. img_dst = np.zeros([dst_cols, dst_rows])
  13. for i in range(dst_cols-1):
  14. for j in range(dst_rows-1):
  15. #坐标转换
  16. scr_x=(i+0.5)/scale-0.5
  17. scr_y=(j+0.5)/scale-0.5
  18. # 整数部分
  19. int_x = int(scr_x)
  20. int_y = int(scr_y)
  21. # 小数部分
  22. float_x=scr_x-int_x
  23. float_y=scr_y-int_y
  24. sum=0
  25. for r in range(-1,3):
  26. for c in range(-1,3):
  27. sum+=img[int_x+r][int_y+c]*s(r-float_x)*s(c-float_y)
  28. img_dst[i][j]=sum
  29. return img_dst
'
运行

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号