安装环境
pip install --upgrade setuptools
pip install numpy Matplotlib
pip install opencv-python
测试代码
import cv2 as cv
#读取图像,支持 bmp、jpg、png、tiff 等常用格式
img = cv.imread("python学习/OpenCV/test.jpg")
#创建窗口并显示图像
cv.namedWindow("Image")
cv.imshow("Image",img)
cv.waitKey(0)
#释放窗口
cv2.destroyAllWindows()
模板匹配
图片的每一个像素点都是一个数字,一张灰度图上的像素点的颜色从 0~255 为由黑到白。
模板匹配的概念就是两张图片每个相同位置像素点的对比。
cv2.matchTemplate(img, img_Temp, cv2.TM_SQDIFF) #三个属性分别为:目标图片,模板图片,对比方法
模板匹配的缺点在于如果目标图片发生旋转或大小变化则无法正确对比。
图像预处理
以识别银行卡号为例,一张彩色的包含银行卡号的图片,是无法直接与模板图片进行匹配的,所以要将这个彩色图片处理为与模板相似的黑白图片。
图像预处理方法:
- 二值化
- 全局阈值
- 自适应阈值
- 轮廓筛选
- 轮廓面积
- 轮廓外接矩形
- 形态学变化
- 膨胀、腐蚀
- 开运算、闭运算
- 礼帽、黑帽、……
图像二值化
如下图,为图片在不同阈值下的不同状态。
全局阈值
全局阈值是一个给定值。
某像素点的灰度小于这个值,则会设置为一个颜色;
某像素点的灰度大于这个值,则会设置为另一个颜色。
thresh, dst = cv2.threshold(src, thresh, maxVal, type) #四个属性分别为:图片路径,阈值,最大值,二值化类型。返回的两个参数分别为:阈值,二值化处理后的图片。
自适应阈值
在某个区域设置一个阈值,决定显示哪种颜色。
自适应阈值可以更容易地凸显图像的轮廓。
cv2.adaptiveThreshold(src, maxVal, adaptiveMethod, type, blocksize, C)
#六个属性分别为:图片路径,最大值,自适应方法,二值化类型,像素邻域尺寸,常数。
像素邻域大小
值是给定的:3,5,7……
用于阈值计算时,考虑某像素周围像素点灰度的范围。
常数 C
阈值计算
假设 blocksize=3,C=10
$$
thresh = blocksize^2个平均灰度 - C = 9个平均灰度 - 10
$$
注:“9 个平均灰度”的意思是以目标像素点为中心的九宫格区域的这九个像素点的平均灰度
二值化类型
如下图,cv2.THRESH_BINARY
方法的解释为:
当图片的某一像素点灰度值大于阈值时,将此像素点的灰度设为最大值,反之则设为 0。
cv2.THRESH_BINARY_INV
方法则与之相反(inv 意为 inverse)。
轮廓筛选
contours, hierarchy = cv2.findCountours(img, mode, method) #img为灰度图或二值图
#contours返回的是轮廓列表
轮廓检索模式(mode)有两种:
cv2.RETR_EXTERNAL
: 检测外轮廓cv2.RETR_TREE
: 等级树结构的轮廓。会将内轮廓、外轮廓都检索出来,也会告诉我们它们之间的关系。
轮廓近似方法(method)同样也是两种:
cv2.CHAIN_APPROX_NONE
: 所有像素点cv2.CHAIN_APPROX_SIMPLE
: 直线两端的点(如果是一条线,那么只取两个端点坐标并记录)
如图所示,contours 返回出来的结果
len(list)
可以用于输出轮廓的个数
contours[1]
输出的是数组。
绘制轮廓
img = cv2.drawContours(image, contours, i, color, thickness)
#contours为轮廓列表