opencv学习指南⼊门篇(⼀):图像基本操作
⽂章⽬录
1.在Ubuntu16.04系统上安装OpenCV和imutils
(1)opencv安装在我之前的博⽂上介绍过可以翻阅;
(2)安装imutils:
pip install imutils
如果是使⽤虚拟环境的话,记得进⼊虚拟环境后再安装imutils
简单介绍⼀下imutils:它是在opencv的基础上对⼀些⽅法进⾏了封装,使得⼀些图像处理⽅法更⽅便易⽤
2.查看我们opencv项⽬结构
假设我们将下载到的源码存放在“下载”⽂件夹下,执⾏以下命令:
cd下载
unzip opencv-tutorial.zip
cd opencv-tutorial
tree
opencv项⽬结构.png
第⼀个脚本opencv_tutorial_01.py将使⽤电影《侏罗纪公园》中的图像(jp.png)进⾏基本的图像处理操作。
第⼆个脚本opencv_tutorial_02.py将介绍如何使⽤这些图像处理模块来创建OpenCV应⽤程序,以计算Tetris图像(tetris_blocks.png )中的对象数量。
3.加载并显⽰图像
⾸先在⽂本编辑器或IDE中打开opencv_tutorial_01.py:
#导⼊必要的软件包
import imutils
import cv2
#加载并显⽰图像尺⼨
#将图像表⽰为包含h、w、d的多维numpy数组即变量"image"
#形状参数包括⾏(height) x 列 (width) x 通道 (depth)
image = cv2.imread("jp.png")
(h, w, d)= image.shape
print("width={}, height={}, depth={}".format(w, h, d))
#在屏幕上显⽰图像,⿏标要点击到图像窗⼝
#按任意键继续执⾏程序
cv2.imshow("Image", image)
cv2.waitKey(0)
深度是通道数——在我们的例⼦中是3,因为我们正在使⽤3个颜⾊通道:蓝⾊,绿⾊和红⾊(RGB)。
print输出宽、⾼、深度:
width=600, height=322, depth=3
cv2.waitKey(0):等待按键,这⼀点很重要,否则我们的图像显⽰和消失的速度将⽐我们看到图像还要快
4.访问单个像素
所有图像都由像素组成,640 x 480图像具有640列(宽度)和480⾏(⾼度),有640×480 = 307200个像素点
灰度图像中的每个像素都有⼀个代表灰度的值,在OpenCV中,有256种灰度(从0到255)。因此,灰度图像将具有与每个像素关联的灰度值。
彩⾊图像中的像素具有其他信息,在学习图像处理时很快就会熟悉⼏种⾊彩空间。为简单起见,我们仅考虑RGB颜⾊空间。
在OpenCV彩⾊图像中,RGB(红⾊,绿⾊,蓝⾊)颜⾊空间中的每个像素都有⼀个3元组(B, G, R) ,注意,顺序是BGR⽽不是RGB。BGR 3元组中的每个值的范围为[0, 255] 。OpenCV中RGB图像中的每个像素有多少种颜⾊可能性?这很简单:256×256×256 = 16777216
图像坐标系规定是左上⾓为(0,0)
#访问位于x = 50(w),y = 100(h)的RGB像素
#OpenCV以BGR⽽不是RGB的顺序存储图像
(B, G, R)= image[100, 50]
print("R={}, G={}, B={}".format(R, G, B))
前⾯已知图⽚尺⼨为width=600, height=322, depth=3 。我们可以通过指定坐标来访问数组中的各个像素值,只要它们在最⼤宽度和⾼度之内即可,图像指定像素点的格式为:image[Y,X]。
在终端打印出该像素的RGB值:
R=41, G=49, B=37
5.提取感兴趣区域(ROI)
提取“感兴趣区域”(ROI)是图像处理的⼀项重要技能。
举例来说,您正在识别电影中的⼈脸。⾸先,您将运⾏⼈脸检测算法以查正在使⽤的所有帧中⼈脸的坐标。然后,您需要提取⾯部ROI,然后保存它们或对其进⾏处理。
⼿动提取ROI通过数组切⽚来实现:
#从输⼊图像提取⼀个100*100的感兴趣区,
#从x=320,y=60到x=420,y=160,并显⽰图像
roi = image[60:160,320:420]
cv2.imshow("ROI", roi)
cv2.waitKey(0)
数组切⽚的格式为:image[startY:endY, startX:endX],注意前闭后开
6.调整图像⼤⼩
调整图像⼤⼩很重要,原因有很多。⾸先,我们可能需要调整⼤图像的⼤⼩以适合屏幕。在较⼩的图像上,图像处理也更快,因为要处理的像素更少。在深度学习的情况下,我们经常忽略宽⾼⽐来调整图像的⼤⼩,以使体积适合⽹络,这要求图像是正⽅形且具有⼀定尺⼨。
#忽略宽⾼⽐,将原始图像调整为200 x 200像素:
resized = size(image,(200,200))
cv2.imshow("Fixed Resizing", resized)
cv2.waitKey(0)
由于忽略了宽⾼⽐,得到的图像已经失真。
假设要将600像素宽的图像调整为300像素宽,同时保持宽⾼⽐。
#固定⼤⼩调整扭曲了宽⾼⽐,所以让我们将宽度调整为300px,
#但根据宽⾼⽐得到height
r =300.0/ w
dim =(300,int(h * r))
resized = size(image, dim)
cv2.imshow("Aspect Ratio Resize", resized)
cv2.waitKey(0)
我们计算新宽度与旧宽度的⽐率(恰好是0.5)。
在此,我们指定新图像的尺⼨dim 。我们知道,我们希望有⼀个300像素宽的图像,但我们必须乘以该⽐例计算新⾼度h。将dim(图像的尺⼨)输⼊到size函数中,我们现在获得了⼀个名为resized的新图像,该图像没有失真。
但是,我们是否可以使调整⼤⼩时保持宽⾼⽐的过程变得更加容易?
使⽤imutils中的函数:size
#⼿动计算宽⾼⽐可能很⿇烦,
#所以让我们使⽤#imutils库来代替
resized = size(image, width=300)
cv2.imshow("Imutils Resize", resized)
cv2.waitKey(0)
这样保留了宽⾼⽐并调整图像的⼤⼩只需要需要提供图像的width或height作为参数
7.旋转图像
# ⾸先计算图像中⼼,"//"表⽰向下取整除
# 构造旋转矩阵
# 最后应⽤warpAffine函数旋转图像
center =(w //2, h //2)
M = RotationMatrix2D(center,-45,1.0)
rotated = cv2.warpAffine(image, M,(w, h))
cv2.imshow("OpenCV Rotation", rotated)
cv2.waitKey(0)
-45表⽰将图像顺时针旋转45度。回忆⼀下中学关于单位圆的信息,正⾓是逆时针⽅向,负⾓是顺时针⽅向。
# 使⽤imutils执⾏相同的操作
rotated = ate(image,-45)
cv2.imshow("Imutils Rotation", rotated)
cv2.waitKey(0)
但是以上的操作都使图像被裁剪,运⽤ate_bound函数使整个图像保持可见。 :
rotated = ate_bound(image,45)
cv2.imshow("Imutils Bound Rotation", rotated)
cv2.waitKey(0)
rectangle函数opencv
8.平滑图像
在许多图像处理场合中,我们必须对图像进⾏模糊处理以减少⾼频噪声,从⽽使我们的算法更容易检测和理解图像的实际内容,在OpenCV 中,对图像进⾏模糊处理⾮常容易,并且有多种⽅法可以完成图像处理。
# 将具有11x11内核的⾼斯模糊应⽤于图像以使其平滑,减少⾼频噪声
blurred = cv2.GaussianBlur(image,(11,11),0)
cv2.imshow("Blurred", blurred)
cv2.waitKey(0)
较⼤的内核将产⽣更模糊的图像,较⼩的内核将创建较少的模糊图像。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。