ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

图像采样python

2021-09-18 21:58:04  阅读:172  来源: 互联网

标签:采样 python 图像 线性插值 像素 dstW dstH


之前总是听上采样,下采样一直不懂,这学期学了数字图像课终于明白了。

采样

是指对图像像素点的选择或拒绝,采样是对图像在空间上的操作,采样分为上采样和下采样,上采样是用来增大图像的,下采样是用来缩小图像的。

为了增加图像的大小采用上采样,会出现一个问题:新的图像会有一些像素点在原来的小图像中没有对应的像素,需要采用插值的办法来补充像素点。比如最近邻插值,双线性插值,三次插值。

最近邻插值法:
在放大图像时,多出来的像素点由最近邻的像素点构成
在这里插入图片描述
算法流程:
计算新图形(放大后或缩小后)的坐标点像素值对应于原图像中哪一个像素点填充的。
在这里插入图片描述
解释:src是原图,dst是新图,原来的图像宽度/高度除以新图像的宽度/高度可以得到缩放比例,假如是缩小图片括号内的数字小于1,放大则大于1,相当于系数,再乘以新图片的宽度/高度,就实现了缩放。

def NN_interpolation(img,dstH,dstW):
	#左边的参数要写全,不要漏了通道数
	srcH,srcW,t=img.shape
	retimg=np.zeros((dstH,dsW,3),dtype=np.unit8)
	for i in range(dstH-1):
		for j in range(dstW-1):
			srcx=round(i*(srcH/dstH))
			srcy=round(j*(srcW/dstW))
			retimg[i,j]=img[srcx,srcy]
	return retimg

完整代码

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np 
import math
 
# 最近邻插值算法
# dstH为新图的高;dstW为新图的宽
def NN_interpolation(img,dstH,dstW):
    scrH,scrW,t=img.shape#src原图的长宽
    retimg=np.zeros((dstH,dstW,3),dtype=np.uint8)
    for i in range(dstH-1):
        for j in range(dstW-1):
            scrx=round(i*(scrH/dstH))
            scry=round(j*(scrW/dstW))
            retimg[i,j]=img[scrx,scry]
    return retimg
 
im_path='./pikaqiu.jpeg'
image=np.array(Image.open(im_path))

plt.figure(figsize=(16, 8))

plt.subplot(1,2,1)
plt.imshow(image)

image1=NN_interpolation(image,image.shape[0]*2,image.shape[1]*2)
#从array转换成image
image1=Image.fromarray(image1.astype('uint8')).convert('RGB')
image1.save('out.png')
plt.subplot(1,2,2)
plt.imshow(image1)

长宽各放大2倍:可以看见放大的图像有点突兀。
在这里插入图片描述

在这里插入图片描述


双线性插值

在两个方向分别进行一次线性插值(首先在一个方向上使用线性插值,然后再在另一个方向上使用线性插值执行双线性插值。尽管每个步骤在采样值和位置上都是线性的,但是插值总体上不是线性的,而是在采样位置上是二次的。)并且选择x方向和y方向进行插值的先后顺序没有唯一标准。

由单线性插值出发:
在这里插入图片描述
在这里插入图片描述

上述的式子都是直线的斜率,经过移项得到y的式子

推广到双线性插值
在这里插入图片描述

**目的:**求P点的像素值
**已知:**我们已知了Q11、Q21、Q12、Q22、P的坐标。也知道Q11、Q21、Q12、Q22的像素值。 先用关于X的单线性插值去分别计算R1、R2的像素值:

在这里插入图片描述

关于上面的式子,我还想了一下,因为Q11和Q21都是在同一个y轴上的,他怎么能由斜率相等得到一个式子呢?
后来我仔细观察发现,这不是简单的XOY坐标图,他是包含了灰度值的.

再使用关于y方向的单线性插值计算P点的像素值
在这里插入图片描述
到此就可以求出P点的像素值了


各种双线性插值的直观展示:
在这里插入图片描述


未完待更——

标签:采样,python,图像,线性插值,像素,dstW,dstH
来源: https://blog.csdn.net/weixin_45454137/article/details/120372712

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有