Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法

Glory ·
更新时间:2024-11-13
· 612 次阅读

系列文章
Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法

目录图像处理一、OpenCV框架与图像插值算法1.1 OpenCV简介1.2 图像插值算法1.3 resize函数1.4 代码实现 图像处理

图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。图像处理技术一般包括图像压缩,增强和复原,匹配、描述和识别3个部分。

一、OpenCV框架与图像插值算法 1.1 OpenCV简介

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

环境配置为:win7+python3.6+numpy1.14.2+opencv-python3.4.1

安装opencv-python3.4.1

首先去网站下载OpenCV对应的.whl版本压缩包,网址https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv本人下载的版本是:opencv_python‑3.4.1‑cp36‑cp36m‑win_amd64.whl 64位系统对应python3.6的

百度云链接:https://pan.baidu.com/s/10RefansrC4_0zsNehjyKTg

pip install opencv_python-3.4.1-cp36-cp36m-win_amd64.whl

导入OpenCV

import cv2

验证是否环境已配置好

print(cv2.__version__)

输出:3.4.1

1.2 图像插值算法

在图像经过空间位置变换之后,需要求取在新平面的新排列的各点像素的位置,其并不会改变映射前后的像素的像素值。这种空间位置变换通常包含缩放、平移与旋转等。

其中常见的图像插值算法有最近邻插值、双线性插值和三次样条插值。

ps:markdown格式的公式书写现在还不熟练,这里把重点放到利用opencv库对算法的调用实现上,只对算法进行简单地描述,算法原理暂时用图代替。

最近邻插值:是指将目标图像中的点对应到源图像中,找出其距离最近的像素点,用该店的像素值代替目标图像中的像素值。这种插值的算法容易使转换后的图片有较多的马赛克,看起来过渡不自然。

原图(3×3):
3*3
变换后(4×4):
4*4

双线性插值:由于图像都是二维的,所以需从单线性插值推到双线性插值,其中这种线性插值会改变该点的像素值。其原理是根据于待求点最近4个点的像素值,计算出该点的像素值。
在这里插入图片描述
三次样条插值这里不再详细论述。

1.3 resize函数

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

参数说明:

src - 原图
desize - 输出的图像大小
fx - 沿水平轴的比例因子
fy - 沿垂直轴的比例因子
interpolation - 插值方式

插值方式:

cv2.INTER_NEAREST - 最近邻插值
cv2.INTER_LINEAR - 双线性插值
cv2.INTER_CUBIC - 基于4x4像素邻域的3次插值法
cv2.INTER_AREA - 基于局部像素的重采样

一般,缩小用cv2.INTER_AREA ,放缩使用cv2.INTER_LINEAR(较快)和cv2.INTER_CUBIC(较慢)。默认使用cv2.INTER_LINEAR。

1.4 代码实现 #%% import cv2 if __name__ == "__main__": img = cv2.imread('test_01.jpg', cv2.IMREAD_UNCHANGED) print('Original Dimensions : ',img.shape) scale_percent = 30 # percent of original size width = int(img.shape[1] * scale_percent / 100) height = int(img.shape[0] * scale_percent / 100) dim = (width, height) # resize image resized = cv2.resize(img, dim, interpolation = cv2.INTER_LINEAR) fx1 = 1.5 fy1 = 1.5 fx2 = 0.7 fy2 = 0.7 resized1 = cv2.resize(resized, dsize=None, fx=fx1, fy=fy1, interpolation = cv2.INTER_NEAREST) resized2 = cv2.resize(resized, dsize=None, fx=fx1, fy=fy1, interpolation = cv2.INTER_LINEAR) resized3 = cv2.resize(resized, dsize=None, fx=fx1, fy=fy1, interpolation = cv2.INTER_CUBIC) resized4 = cv2.resize(resized, dsize=None, fx=fx2, fy=fy2, interpolation = cv2.INTER_AREA) print('Resized Dimensions : ',resized.shape) #cv2.imshow("original image", img) cv2.imshow("Resized image", resized) cv2.imshow("INTER_NEAREST image", resized1) cv2.imshow("INTER_LINEAR image", resized2) cv2.imshow("INTER_CUBIC image", resized3) cv2.imshow("INTER_AREA image", resized4) cv2.waitKey(0) cv2.destroyAllWindows()

Original Dimensions : (1600, 2560, 3)
Resized Dimensions : (480, 768, 3)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


作者:清崎教练



插值 opencv 算法 Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号