计算机视觉
计算机视觉又称为机器视觉,是一门研究如何使机器“看”的科学,就是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给一起检测的图像,它是一个广阔的领域,用时计算机的应用领域也很多,如无人驾驶、无人安防、人脸识别、车辆车牌识别、以图搜图等等。
什么是opencv
opencv是一个基于BSD许可(开源)的计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。采用c和c++编写,在性能方面可谓是相当有优势,提供了图像处理和计算机视觉方面的很多算法,我们可以用opencv来进行图像处理,目标检测,工业产品质量检验等等。同时opencv的ML模块也是一个完备通用的机器学习库,可以帮助我们处理机器学习问题。
如何安装
python中安装opencv还是比较简单的,我们直接用pip安装即可。
pip install opencv-python
python-opencv基础图像处理 在opencv中我们最常打交道的就是图像了,所以我们有必要先来了解一下图像与色彩相关的知识。
图像基础知识
一、像素
像素是指由图像的小方格组成的,这些小方块都有一个明确的位置和被分配的色彩数值,小方格颜色和位置就决定该图像所呈现出来的样子。 可以将像素视为整个图像中不可分割的单位或者是元素。不可分割的意思是它不能够再切割成更小单位抑或是元素,它是以一个单一颜色的小格存在 。每一个点阵图像包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。
二、图像分类
图像根据颜色通常可以分为:彩色图像、二值图像和灰度图像
彩色图像:
彩色图像是指每个像素由R、G、B分量构成的图像,其中R、G、B是由不同的灰度级来描述的。
二值图像:
将图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白、B&W、单色图像表示二值图像。
二值图像是指在图像中,灰度等级只有两种,也就是说,图像中的任何像素点的灰度值均为0或者255,分别代表黑色和白色。
灰度图像:
图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑白两种颜色,灰度图像在黑色与白色之间还有许多级的颜色深度。
三、颜色空间(颜色模型:RGB,HSV,Lab)
RGB是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,取值范围都是:[0,255],[0,255],[0,255]
在opencv中是以BGR作为颜色空间,这其实是个历史问题,早期开发者使用BGR作为颜色的空间的原因在于:那个时候的BGR格式在相机制造厂商和软件提供商之间比较受欢迎,所以一直也就延续了下来。
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。 这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。
H (Hue)色相:[0,360]
S (Saturation)饱和度,即色彩纯净度,0饱和度为白色
V (Value/Brightness):明度 0明度为纯黑色
在OpenCV中,颜色范围:
H = [0,180]
S = [0,255]
V = [0,255]
HSV颜色范围表
Lab颜色模型由三个要素组成,一个是亮度,以及两个颜色分量a与b来表示颜色。a包括的颜色是从深绿色(低亮度值)到灰色(中亮度值)再到亮粉红色(高亮度值);b是从亮蓝色(低亮度值)到灰色(中亮度值)再到黄色(高亮度值)。
L 通道:像素亮度,上白下黑 中间灰 a 通道:左绿 右红 b 通道:一端纯蓝,一端纯黄
pyton-opencv图像处理简单示例
1.图像展示
#-*- coding:utf8 -*-
import cv2
path = 'sallen.jpeg'
# 照片读取
img = cv2.imread(path)
# 展示
cv2.imshow("show_img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.图像二值化
#-*- coding:utf8 -*-
import cv2
path = 'sallen.jpeg'
# 照片读取
img = cv2.imread(path)
# 灰度处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
'''
cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst
src:表示的是图片源
thresh:表示的是阈值(起始值)
maxval:表示的是最大值
type:表示的是这里划分的时候使用的是什么类型的算法**,常用值为0(cv2.THRESH_BINARY)**
'''
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 展示
cv2.imshow("binary", binary)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.颜色直方图
import cv2
from matplotlib import pyplot as plt
path = 'sallen.jpeg'
img = cv2.imread(path, cv2.IMREAD_COLOR)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_b = img[..., 0]
img_g = img[..., 1]
img_r = img[..., 2]
'''
imaes:输入的图像
channels:选择图像的通道
mask:掩膜,是一个大小和image一样的np数组,其中把需要处理的部分指定为1,不需要处理的部分指定为0,一般设置为None,表示处理整幅图像
histSize:使用多少个bin(柱子),一般为256
ranges:像素值的范围,一般为[0,255]表示0~255
'''
b_hist = cv2.calcHist([img],[0], None, [256], [0, 256])
g_hist = cv2.calcHist([img], [1], None, [256], [0, 256])
r_hist = cv2.calcHist([img], [2], None, [256], [0, 256])
plt.subplot(221)
plt.imshow(img)
plt.axis('off')
plt.title('source')
# 显示3个通道的颜色直方图
plt.subplot(222)
plt.plot(b_hist, label='B', color='blue')
plt.plot(g_hist, label='G', color='green')
plt.plot(r_hist, label='R', color='red')
plt.legend(loc='best') #给照片加上图例
plt.xlim([0, 256])
plt.show()
4.图像缩放
import cv2
img = cv2.imread("sallen.jpeg")
cv2.imshow("img",img)
img_1 = cv2.resize(img,(100,100))
cv2.imshow("img1",img_1)
cv2.waitKey()
5.图像添加文字
import cv2
img = cv2.imread('sallen.jpeg')
font = cv2.FONT_HERSHEY_SIMPLEX
# cv2.putText(src, text, place, Font, Font_Size, Font_Color, Font_Overstriking)
res_img = cv2.putText(img, 'hello world', (0, 50), font, 1.2, (0, 0, 0), 2)
cv2.imshow("img_text",res_img)
cv2.waitKey()
6.生成指定大小空图片
import cv2
import numpy as np
img_black = np.zeros((500,500),np.uint8)
cv2.imshow("img_black",img_black)
cv2.waitKey()
7.图像位移
import cv2
import numpy as np
img = cv2.imread('sallen.jpeg')
cv2.imshow('source',img)
#原图片的高和宽
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
#创建移位矩阵
matShift = np.float32([[1,0,0],[0,1,100]])#2*3矩阵 y向下偏移
#cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst
dst = cv2.warpAffine(img,matShift,(height,width))
cv2.imshow('dst',dst)
cv2.waitKey()
8.图像镜像
import cv2
import numpy as np
img = cv2.imread('sallen.jpeg')
cv2.imshow('source',img)
img1 = cv2.flip(img,1)
'''
flip(src, flipCode[, dst]) -> dst
参数1 输入图像
参数2 flipCode。用于指定镜像翻转的类型,code >0 表示水平翻转,code =0 表示垂直翻转,code <0 表示水平和垂直翻转。
参数3 可选参数。用于设置输出数组,即镜像翻转后的图像数据,默认为与输入图像数组大小和类型都相同的数组。
'''
cv2.imshow('flip',img1)
cv2.waitKey()
9.图像旋转
import cv2
import numpy as np
path = 'sallen.jpeg'
image = cv2.imread(path)
cv2.imshow("source", image)
(h, w) = image.shape[:2]
center = (w / 2, h / 2)
'''
getRotationMatrix2D(Point2f center, double angle, double scale)
center:表示源图像的中心
angle:旋转角度,正值为逆时针旋转
scale:缩放系数
'''
M = cv2.getRotationMatrix2D(center, 45, 1.0)
rotated = cv2.warpAffine(image, M, (w, h))
cv2.imshow("Rotated by 45 Degrees", rotated)
cv2.waitKey()
下一章我们会介绍更多的关于opencv对于图像的特效处理及美化。
同名公众号
人工智能、机器学习、计算机视觉等文章分享。干货实战技巧,一起精进技术。