2019-07-19 15:54:31 qq_29507011 阅读数 189
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19532 人正在学习 去看看 夏曹俊

因为插值算法中涉及权重概念,这里顺便对权重进行简要精炼的总结,权重中的权其实就是概率就是占比,权重的目的其实就是得到一个平均值,没啥好神秘的

五种插值算法,目的是用于图像扩大时超分辨率,缩小不失真,常用于放大图片
一、最近邻插值
这种方法失真严重但运算简单,缩小图片可考虑
cv2.resize(img, (0, 0), fx=倍数, fy=倍数, interpolation=cv2.INTER_NEAREST)
二、双线性插值
这种方法最常用, 是resize默认值,首先和最邻近插值算法一样,先获取源图坐标,这个坐标是个小数,最近邻插值算法直接四舍五入,从而得到映射的灰度,而双线性插值不是直接四舍五入,而是根据这个点四周的四个点依据各自的权重得出该点的灰度,计算公式
x0 = x1/scale y0 = y1/scale x = int(x0) y = int(y0) u = x0-x v = y0-y
f(y1,x1) = (1-v)(1-u)f(y,x)+(1-v)uf(y,x+1)+v(1-u)f(y+1,x)+uvf(y+1,x+1)
因为该灰度跟邻近四点有关,所以不会像最近邻插值一样出现锯齿状,所以普遍应用于图像插值.
cv2.resize(img, (0, 0), fx=倍数, fy=倍数, interpolation=cv2.INTER_LINEAR)
三、使用像素关系区域进行重采样
待续
cv2.resize(img, (0, 0), fx=倍数, fy=倍数, interpolation=cv2.INTER_AREA)
四、双三次插值
待续
cv2.resize(img, (0, 0), fx=倍数, fy=倍数, interpolation=cv2.INTER_CUBIC)
五、Lanczos插值
待续
cv2.resize(img, (0, 0), fx=倍数, fy=倍数, interpolation=cv2.INTER_LANCZOS4)

首先完成第一个最近邻插值,这里只针对放大进行说明:关键点——放大图片的像素点是在原图片中进行映射得到,映射公式x0 = x1/倍数,y0 = y1/倍数,先根据放大图片的坐标算出原图片坐标,从而放大图片像素等于原图片该点像素。代码实现如下:

import numpy as np
import cv2

path = 'test.jpg'
image = cv2.imread('test.jpg',0)

def near(image,scale):
	hight,width = image.shape
	img = np.zeros((hight*scale,width*scale))
	for i in range(img.shape[0]-4):
		for j in range(img.shape[1]-4):
			x = round(i/scale)
			y = round(j/scale)
			img[i,j] = image[x,y]

	return img

img = near(image,4)
cv2.imshow('test',img.astype(np.uint8))
cv2.waitKey(0)
cv2.destroyWindow()

效果图如下:
在这里插入图片描述

双线性图像插值算法代码如下:

def double_insert(image,scale):
	hight,width = image.shape
	h = hight*scale
	w = width*scale
	img = np.zeros((h,w))
	for i in range(h-4):
		for j in range(w-4):
			y = int(i/scale)
			x = int(j/scale)
			img[i,j] = (y+1-i/scale)*(x+1-j/scale)*image[y,x]+(y+1-i/scale)*(j/scale-x)*image[y,x+1]+(i/scale-y)*(x+1-j/scale)*image[y+1,x]+(i/scale-y)*(j/scale-x)*image[y+1,x+1]
	return img

效果图如下:
在这里插入图片描述

2018-05-14 17:07:29 qq_35447659 阅读数 301
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19532 人正在学习 去看看 夏曹俊

1.最近邻插值

import cv2  
import numpy as np 
import time 
from traitlets.config.application import catch_config_error
def function(img,dstHeight,dstWidth):  
    height,width,channels =img.shape  
    emptyImage=np.zeros((dstHeight,dstWidth,channels),np.uint8)  
    sh=dstHeight/height  
    sw=dstWidth/width 
    for i in range(dstHeight):  
        for j in range(dstWidth):  
            x=min(round(i/sh), height-1) 
            y=min(round(j/sw), width-1) 
            emptyImage[i,j]=img[x,y]  
    return emptyImage
if __name__ == '__main__':
    img_in = cv2.imread('1.jpg')
    start = time.time()
    dstHeight=200
    dstWidth=200
    img_out=function(img_in,dstHeight,dstWidth)  
    print ('cost %f seconds' % (time.time() - start))
    cv2.imshow('src_image', img_in)
    cv2.imshow('dst_image', img_out)
    cv2.waitKey()  

2.双线性插值

# coding=utf-8
import cv2
import numpy as np
import time
def resize(src, new_size):
    dst_w, dst_h = new_size # 目标图像宽高
    src_h, src_w = src.shape[:2] # 源图像宽高
    if src_h == dst_h and src_w == dst_w:
        return src.copy()
    scale_x = float(src_w) / dst_w # x缩放比例
    scale_y = float(src_h) / dst_h # y缩放比例
    # 遍历目标图像,插值
    dst = np.zeros((dst_h, dst_w, 3), dtype=np.uint8)
    for n in range(3): # 对channel循环
        for dst_y in range(dst_h): # 对height循环
            for dst_x in range(dst_w): # 对width循环
                # 目标在源上的坐标
                src_x = (dst_x + 0.5) * scale_x - 0.5  #定位像素点:中心对齐
                src_y = (dst_y + 0.5) * scale_y - 0.5
                # 计算在源图上四个近邻点的位置
                src_x_0 = int(np.floor(src_x))
                src_y_0 = int(np.floor(src_y))
                src_x_1 = min(src_x_0 + 1, src_w - 1)
                src_y_1 = min(src_y_0 + 1, src_h - 1)
                # 双线性插值
                # 设(x,y)为插值点在源图像的坐标,待计算插值为z
                # 首先x方向上插值:相邻两点为(x0,y0)、(x1,y0),像素值分别为z0=f(x0,y0)、z1=f(x1,y0),从而有公式:z−z0x−x0=z1−z0x1−x0,从而插值z=x1−xx1−x0z0+x−x0x1−x0z1
                # 
                # 然后y方向上插值:以上得到的上方插值z
                # 记为ztop,同理可得下方插值为zbot,那么最后插值为:Z=y1−yy1−y0ztop+y−y0y1−y0zbot
                value0 = (src_x_1 - src_x) * src[src_y_0, src_x_0, n] + (src_x - src_x_0) * src[src_y_0, src_x_1, n]
                value1 = (src_x_1 - src_x) * src[src_y_1, src_x_0, n] + (src_x - src_x_0) * src[src_y_1, src_x_1, n]
                dst[dst_y, dst_x, n] = int((src_y_1 - src_y) * value0 + (src_y - src_y_0) * value1)
    return dst

if __name__ == '__main__':
    img_in = cv2.imread('1.jpg')
    start = time.time()
    img_out = cv2.resize(img_in, (600,600))
    print ('cost %f seconds' % (time.time() - start))

    cv2.imshow('src_image', img_in)
    cv2.imshow('dst_image', img_out)
    cv2.waitKey()

相关博客:

https://blog.csdn.net/smf0504/article/details/51303962

https://blog.csdn.net/xbinworld/article/details/65660665

https://blog.csdn.net/qq_29058565/article/details/52769497

2015-08-20 16:18:06 zhangchen1003 阅读数 1595
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19532 人正在学习 去看看 夏曹俊

一、图像插值
所谓图像插值就是一个图像数据的再生过程,利用己知采样点的灰度值计未知采样点的灰度值,在给定的空间范围内,从有限的离散采样数据复原出原来连续的图像信号。


1.1怎么理解图像插值
比如,图像放大算法,假设原图像是mXn大小,现在我们扩大两倍,一种简单的方法是,我们假想一个2mX2n大小的网格,它与原图像有相同大下的间隔,然后将其收缩,使其准确的跟原图像匹配,当然收缩后的图像网格间隔要小于与图像的间隔,那么肯定有些点不能与原图像像素点有对应,为了对覆盖的每一个点赋予灰度值,我们在原图像中,寻找最接近的像素,并把其赋给2mX2n网格中的新像素,当我们对所有的像素点都赋予灰度值后,即2mX2n个点都被赋予像素值后,就把图像扩展到原来规定的大小,得到放大的图像;
简单来说,就是补充数据


1.2 常用的图像插值方法
最近邻(nearestneighbor)插值是最简便的插值算法,它以插值像素点周围离最近的己知像素的灰度值作为插值像素点的灰度值,所以又称为像素复写印ixrePlication)或零阶保持(zero一orderholding)插值。
最近邻插值运算简单快速,能够保持插值图像边缘的清晰,但边缘轮廓出显著的锯齿现象,图像背景产生马赛克,形成伪边缘,视觉效果差,重构误大。
作为对最近邻点法的一种改进,这种方法是“利用周围4个邻点的灰度值在两个方向上作线性内插以得到待采样点的灰度值”,即根据待采样点与相邻点的距离确定相应的权值计算出待采样点的灰度值。
双线性内插法由于考虑了待采样点周围四个直接邻点对待采样点的影响,因此基本克服了前者灰度不连续的缺点,其计算量有所增大。但进一步看,由于此方法仅考虑四个直接邻点灰度值的影响,而未考虑到各邻点间灰度值变化率的影响,
因此具有低通滤波器的性质,使缩放后图像的高频分量受到损失,图像的轮廓变得较模糊。用此方法缩放后的图像与原图像相比,仍然存在由于计算模型考虑不周而产生的图像质量退化与精度降低的问题


二、几何变换
一个空间变换需要两个独立的算法首先,需要一个算法来定义几何变换本身,用来描述每个像素如何从其初始位置移动到终止位置,即每个像素的运动。同时,还需要一个用于灰度插值的算法,即对空间变换后的像素赋予灰度值

三、常见操作
3.1 图像的缩放
matlab中可以用imresize函数对图像进行缩放,使用形式:
imresize(A,n)A为图像,n为放大倍数。
imresize(A,[n,m])把原有的图像放大为行列分别为n,m的图像。
三种插值方法:
1.最近邻插值法:是imreseze默认的方法,
2.双线性插值方法:格式:imresize(A,n,’bilinear’).
3.双立方插值方法:格式:imresize(A,n,’bicubic’).

clear;
clc;
close all;
f=imread('lenna.bmp');
f=rgb2gray(f);
[m,n]=size(f);
X=1:m;
Y=1:n;
[X,Y]=meshgrid(X,Y);%生成网格矩阵
X1=1:0.5:m;
Y1=1:0.5:n;
[X1,Y1]=meshgrid(X1,Y1);生成网格矩阵
J=interp2(X,Y,f,X1,Y1,'nearest');进行插值运算
figure,imshow(f)
figure,
imshow(J)

3.2图像的旋转
一般的格式为:imrotate(A,Angle,Method,Bbox).
Angle:旋转地角度,
Method:为插值的方法,nearest、bilinear、bicubic
Bbox:loose和crop

3.3图像的裁剪
使用imcrop函数对图像进行裁剪操作,
imcrop(A,[80,120,100,50]);
[80,120,100,50]的含义是,以图像的(80,,10)点位裁剪矩形的左上角坐标,裁剪的宽度是100,高度是50。

3.4图像的几何变换
图像二维仿射变换MATLAB使用imtransform函数完成图像空间变换。
imtransform(A,T)
A:是要变换的图像
T:是由makeform函数产生的变换结构.
在maketform(‘P’,……)函数中,
参数P:
affine:仿射变换形式。
projective:投影变换形式;
cusyom:自定义函数变换;
box:利用函数中的另外参数产生仿射变换结构;
composite:该参数是实现多次调用tformfwd功能;

I=imread('peppers.png'); 
Ta = maketform('affine', ...
[cosd(30) -sind(30) 0; sind(30) cosd(30) 0; 0 0 1]');% 创建旋转参数结构体
Ia = imtransform(I,Ta); %实现图像旋转  
Tb = maketform('affine',[5 0 0; 0 10.5 0; 0 0 1]'); %创建缩放参数结构体
Ib = imtransform(I,Tb);%实现图像缩放  
2014-10-29 08:36:17 phoenixtree7 阅读数 533
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19532 人正在学习 去看看 夏曹俊


[转自] http://blog.csdn.net/yangtrees/article/details/8896531


常用的插值方法                                                                                                                                                        


1、最邻近元法

  这是最简单的一种插值方法,不需要计算,在待求象素的四邻象素中,将距离待求象素最近的邻象素灰度赋给待求象素。设i+u, j+v(i, j为正整数, u, v为大于零小于1的小数,下同)为待求象素坐标,则待求象素灰度的值 f(i+u, j+v) 如下图所示:

 

 

如果(i+u, j+v)落在A区,即u<0.5, v<0.5,则将左上角象素的灰度值赋给待求象素,同理,落在B区则赋予右上角的象素灰度值,落在C区则赋予左下角象素的灰度值,落在D区则赋予右下角象素的灰度值。

最邻近元法计算量较小,但可能会造成插值生成的图像灰度上的不连续,在灰度变化的地方可能出现明显的锯齿状。

 

2、双线性内插法

双线性内插法是利用待求象素四个邻象素的灰度在两个方向上作线性内插,如下图所示:

 

 

对于 (i, j+v),f(i, j) 到 f(i, j+1) 的灰度变化为线性关系,则有:

      f(i, j+v) = [f(i, j+1) - f(i, j)] * v + f(i, j)

同理对于 (i+1, j+v) 则有:

                  f(i+1, j+v) = [f(i+1, j+1) - f(i+1, j)] * v + f(i+1, j)

从f(i, j+v) 到 f(i+1, j+v) 的灰度变化也为线性关系,由此可推导出待求象素灰度的计算式如下:

                  f(i+u, j+v) = (1-u) * (1-v) * f(i, j) + (1-u) * v * f(i, j+1) + u * (1-v) * f(i+1, j) + u * v * f(i+1, j+1)

双线性内插法的计算比最邻近点法复杂,计算量较大,但没有灰度不连续的缺点,结果基本令人满意。它具有低通滤波性质,使高频分量受损,图像轮廓可能会有一点模糊。

 

3、三次内插法

该方法利用三次多项式S(x)求逼近理论上最佳插值函数sin(x)/x, 其数学表达式为:

待求像素(x, y)的灰度值由其周围16个灰度值加权内插得到,如下图:

 

 

待求像素的灰度计算式如下:

 

f(x, y) = f(i+u, j+v) = ABC

 

其中: 

 

三次曲线插值方法计算量较大,但插值后的图像效果最好。


插值方法总结:                                                                                                                                                       

“Inverse Distance to a Power(反距离加权插值法)”、
“Kriging(克里金插值法)”、
“Minimum Curvature(最小曲率)”、
“Modified Shepard's Method(改进谢别德法)”、
“Natural Neighbor(自然邻点插值法)”、
“Nearest Neighbor(最近邻点插值法)”、
“Polynomial Regression(多元回归法)”、
“Radial Basis Function(径向基函数法)”、
“Triangulation with Linear Interpolation(线性插值三角网法)”、
“Moving Average(移动平均法)”、
“Local Polynomial(局部多项式法)”

1、距离倒数乘方法
距离倒数乘方格网化方法是一个加权平均插值法,可以进行确切的或者圆滑的方式插值。方次参数控制着权系数如何随着离开一个格网结点距离的增加而下降。对于一个较大的方次,较近的数据点被给定一个较高的权重份额,对于一个较小的方次,权重比较均匀地分配给各数据点。
计算一个格网结点时给予一个特定数据点的权值与指定方次的从结点到观测点的该结点被赋予距离倒数成比例。当计算一个格网结点时,配给的权重是一个分数,所 有权重的总和等于1.0。当一个观测点与一个格网结点重合时,该观测点被给予一个实际为 1.0 的权重,所有其它观测点被给予一个几乎为 0.0 的权重。换言之,该结点被赋给与观测点一致的值。这就是一个准确插值。
距离倒数法的特征之一是要在格网区域内产生围绕观测点位置的"牛眼"。用距离倒数格网化时可以指定一个圆滑参数。大于零的圆滑参数保证,对于一个特定的结 点,没有哪个观测点被赋予全部的权值,即使观测点与该结点重合也是如此。圆滑参数通过修匀已被插值的格网来降低"牛眼"影响。

2、克里金法
克里金法是一种在许多领域都很有用的地质统计格网化方法。克里金法试图那样表示隐含在你的数据中的趋势,例如,高点会是沿一个脊连接,而不是被牛眼形等值线所孤立。
克里金法中包含了几个因子:变化图模型,漂移类型 和矿块效应。

3、最小曲率法
最小曲率法广泛用于地球科学。用最小曲率法生成的插值面类似于一个通过各个数据值的,具有最小弯曲量的长条形薄弹性片。最小曲率法,试图在尽可能严格地尊重数据的同时,生成尽可能圆滑的曲面。
使用最小曲率法时要涉及到两个参数:最大残差参数和最大循环次数参数来控制最小曲率的收敛标准。

4、多元回归法
多元回归被用来确定你的数据的大规模的趋势和图案。你可以用几个选项来确定你需要的趋势面类型。多元回归实际上不是插值器,因为它并不试图预测未知的 Z 值。它实际上是一个趋势面分析作图程序。
使用多元回归法时要涉及到曲面定义和指定XY的最高方次设置,曲面定义是选择采用的数据的多项式类型,这些类型分别是简单平面、双线性鞍、二次曲面、三次曲面和用户定义的多项式。参数设置是指定多项式方程中 X 和 Y组元的最高方次 。

5、径向基本函数法
径向基本函数法是多个数据插值方法的组合。根据适应你的数据和生成一个圆滑曲面的能力,其中的复二次函数被许多人认为是最好的方法。所有径向基本函数法都 是准确的插值器,它们都要为尊重你的数据而努力。为了试图生成一个更圆滑的曲面,对所有这些方法你都可以引入一个圆滑系数。你可以指定的函数类似于克里金 中的变化图。当对一个格网结点插值时,这些个函数给数据点规定了一套最佳权重。

6、谢别德法
谢别德法使用距离倒数加权的最小二乘方的方法。因此,它与距离倒数乘方插值器相似,但它利用了局部最小二乘方来消除或减少所生成等值线的"牛眼"外观。谢别德法可以是一个准确或圆滑插值器。
在用谢别德法作为格网化方法时要涉及到圆滑参数的设置。圆滑参数是使谢别德法能够象一个圆滑插值器那样工作。当你增加圆滑参数的值时,圆滑的效果越好。

7、三角网/线形插值法
三角网插值器是一种严密的插值器,它的工作路线与手工绘制等值线相近。这种方法是通过在数据点之间连线以建立起若干个三角形来工作的。原始数据点的连结方法是这样:所有三角形的边都不能与另外的三角形相交。其结果构成了一张覆盖格网范围的,由三角形拼接起来的网。
每一个三角形定义了一个覆盖该三角形内格网结点的面。三角形的倾斜和标高由定义这个三角形的三个原始数据点确定。给定三角形内的全部结点都要受到该三角形的表面的限制。因为原始数据点被用来定义各个三角形,所以你的数据是很受到尊重的。


8.自然邻点插值法
自然邻点插值法(NaturalNeighbor)是Surfer7.0才有的网格化新方法。自然邻点插值法广泛应用于一些研究领域中。其基本原理是对于 一组泰森(Thiessen)多边形,当在数据集中加入一个新的数据点(目标)时,就会修改这些泰森多边形,而使用邻点的权重平均值将决定待插点的权重, 待插点的权重和目标泰森多边形成比例。实际上,在这些多边形中,有一些多边形的尺寸将缩小,并且没有一个多边形的大小会增加。同时,自然邻点插值法 在数据点凸起的位置并不外推等值线(如泰森多边形的轮廓线)。

9.最近邻点插值法
最近邻点插值法(NearestNeighbor)又称泰森多边形方法,泰森多边形(Thiesen,又叫Dirichlet或Voronoi多边形)分 析法是荷兰气象学家A.H.Thiessen提出的一种分析方法。最初用于从离散分布气象站的降雨量数据中计算平均降雨量,现在GIS和地理分析中经常采 用泰森多边形进行快速的赋值。实际上,最近邻点插值的一个隐含的假设条件是任一网格点p(x,y)的属性值都使用距它最近的位置点的属性值,用每一 个网格节点的最邻点值作为待的节点值。


当数据已经是均匀间隔分布,要先将数据转换为SURFER的网格文件,可以应用最近邻点插值法;或者在一个文 件中,数据紧密完整,只有少数点没有取值,可用最近邻点插值法来填充无值的数据点。有时需要排除网格文件中的无值数据的区域,在搜索椭圆 (SearchEllipse)设置一个值,对无数据区域赋予该网格文件里的空白值。设置的搜索半径的大小要小于该网格文件数据值之间的距离,所有的无数 据网格节点都被赋予空白值。在使用最近邻点插值网格化法,将一个规则间隔的XYZ数据转换为一个网格文件时,可设置网格间隔和XYZ数据的数据点之间的间 距相等。最近邻点插值网格化法没有选项,它是均质且无变化的,对均匀间隔的数据进行插值很有用,同时,它对填充无值数据的区域很有效。


Reference                                                                                                                      

http://blog.csdn.net/coy_wang/article/details/5027872

http://blog.sina.com.cn/s/blog_6e51df7f0100vb4b.html


2019-01-21 16:03:41 xjp_xujiping 阅读数 184
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19532 人正在学习 去看看 夏曹俊

转载: https://blog.csdn.net/JNingWei/article/details/78822026

Syntax

cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) → dst

 

 

INTER_NEAREST | 最近邻插值

在一维空间中,最近点插值就相当于四舍五入取整。在二维图像中,像素点的坐标都是整数,该方法就是选取离目标点最近的点。

会在一定程度上损失 空间对称性(Alignment),在 RoI Pooling 中使用。

这里写图片描述

INTER_LINEAR | 双线性插值(默认设置)

在两个方向分别进行一次线性插值。

这里写图片描述

在图像处理的时候,我们先根据

srcX = dstX* (srcWidth/dstWidth)
srcY = dstY * (srcHeight/dstHeight)

 来计算目标像素在源图像中的位置,这里计算的srcX和srcY一般都是浮点数,比如 f(1.2, 3.4)这个像素点是虚拟存在的,先找到与它临近的四个实际存在的像素点

(1,3) (2,3)
(1,4) (2,4)

写成 f(i+u,j+v) 的形式,则 u=0.2,v=0.4, i=1, j=3

f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1) 

保证了 空间对称性(Alignment),在 RoI Align 中使用。

这里写图片描述

INTER_AREA |  使用像素区域关系进行重采样。

略。

INTER_CUBIC  | 4x4像素邻域的双三次插值

略。

INTER_LANCZOS4 |  8x8像素邻域的Lanczos插值

在x,y方向分别对相邻的八个点进行插值,也就是计算加权和,所以它是一个8x8的描述子。
 

Code

# coding=utf-8

import cv2
"""
INTER_NEAREST | 最近邻插值
INTER_LINEAR | 双线性插值(默认设置)
INTER_AREA |  使用像素区域关系进行重采样
INTER_CUBIC  | 4x4像素邻域的双三次插值
INTER_LANCZOS4 |  8x8像素邻域的Lanczos插值
"""

if __name__ == '__main__':
    img = cv2.imread("girl.jpg")
    height, width = img.shape[:2]

    # 缩小图像
    size = (int(width*0.8), int(height*0.7))
    shrink_NEAREST = cv2.resize(img, size, interpolation=cv2.INTER_NEAREST)
    shrink_LINEAR = cv2.resize(img, size, interpolation=cv2.INTER_LINEAR)
    shrink_AREA = cv2.resize(img, size, interpolation=cv2.INTER_AREA)
    shrink_CUBIC = cv2.resize(img, size, interpolation=cv2.INTER_CUBIC)
    shrink_LANCZOS4 = cv2.resize(img, size, interpolation=cv2.INTER_LANCZOS4)

    # 放大图像
    fx = 1.2
    fy = 1.1
    enlarge_NEAREST = cv2.resize(img, (0, 0), fx=fx, fy=fy, interpolation=cv2.INTER_NEAREST)
    enlarge_LINEAR = cv2.resize(img, (0, 0), fx=fx, fy=fy, interpolation=cv2.INTER_LINEAR)
    enlarge_AREA = cv2.resize(img, (0, 0), fx=fx, fy=fy, interpolation=cv2.INTER_AREA)
    enlarge_CUBIC = cv2.resize(img, (0, 0), fx=fx, fy=fy, interpolation=cv2.INTER_CUBIC)
    enlarge_LANCZOS4 = cv2.resize(img, (0, 0), fx=fx, fy=fy, interpolation=cv2.INTER_LANCZOS4)

    # 保存图像
    cv2.imwrite("shrink_NEAREST.jpg", shrink_NEAREST)
    cv2.imwrite("shrink_LINEAR.jpg", shrink_LINEAR)
    cv2.imwrite("shrink_AREA.jpg", shrink_AREA)
    cv2.imwrite("shrink_CUBIC.jpg", shrink_CUBIC)
    cv2.imwrite("shrink_LANCZOS4.jpg", shrink_LANCZOS4)

    cv2.imwrite("enlarge_NEAREST.jpg", enlarge_NEAREST)
    cv2.imwrite("enlarge_LINEAR.jpg", enlarge_LINEAR)
    cv2.imwrite("enlarge_AREA.jpg", enlarge_AREA)
    cv2.imwrite("enlarge_CUBIC.jpg", enlarge_CUBIC)
    cv2.imwrite("enlarge_LANCZOS4.jpg", enlarge_LANCZOS4)
--------------------- 
作者:JNingWei 
来源:CSDN 
原文:https://blog.csdn.net/jningwei/article/details/78822026 
版权声明:本文为博主原创文章,转载请附上博文链接!

Demo

原图像:

这里写图片描述

 

利用插值缩小

 

最近邻插值: 

这里写图片描述
双线性插值(默认设置): 

这里写图片描述
使用像素区域关系进行重采样: 

这里写图片描述
4x4像素邻域的双三次插值: 

这里写图片描述
8x8像素邻域的Lanczos插值: 

这里写图片描述

利用插值放大

最近邻插值: 

这里写图片描述
双线性插值(默认设置): 

这里写图片描述
使用像素区域关系进行重采样: 

这里写图片描述
4x4像素邻域的双三次插值: 

这里写图片描述
8x8像素邻域的Lanczos插值: 

这里写图片描述
--------------------- 
作者:JNingWei 
来源:CSDN 
原文:https://blog.csdn.net/jningwei/article/details/78822026 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

 

没有更多推荐了,返回首页