系列文章
Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法
图像处理(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):
变换后(4×4):
双线性插值:由于图像都是二维的,所以需从单线性插值推到双线性插值,其中这种线性插值会改变该点的像素值。其原理是根据于待求点最近4个点的像素值,计算出该点的像素值。
三次样条插值这里不再详细论述。
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)