OpenCV图像处理笔记[07]
38. 图像轮廓
-
轮廓
-
边缘检测能够测出边缘,但是边缘是不连续的。
-
将边缘连接为一个整体,构成轮廓。
-
-
注意:
-
对象是二值图像。所以需要预先进行阈值分割或者边缘检测处理。
-
查找轮廓需要更改原始图像。因此,通常使用原始图像的一份拷贝操作。
-
在OpenCV中,是从黑色背景中查找白色对象。因此,对象必须是白色的,背景必须是黑色的。
-
-
使用函数
-
cv2.findContours( )
-
cv2.drawContours( )
-
查找图像轮廓的函数是cv2.findContours( ),通过cv2.drawContours( )将查找到的轮廓绘制到图像上。
- cv2.findContours()
image, contours, hierarchy=cv2.findContours(image,mode,method)
-
参数
- mage ,修改后的原始图像
- contours , 轮廓
- hierarchy , 图像的拓扑信息(轮廓层次)
- image , 原始图像
- mode , 轮廓检索模式
- method , 轮廓的近似方法
-
- mode, 轮廓检索模式
- cv2.RETREXTERNAL : 表示只检测外轮廓
- cv2.RETRLIST :检测的轮廓不建立等级关系
- cv2.RETRCCOMP :建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
- cv2.RETRTREE :建立一个等级树结构的轮廓。
- mode, 轮廓检索模式
-
-
method,轮廓的近似方法
-
cv.CHAINAPPROXNONE :到存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max ( abs(×1一×2, abs( y2 - y1 ))== 1
-
cv2.CHAIN-APPROX_SIMPLE : 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
-
cv2℃HAINAPPROXTC89Ll : 使用teh-ChinIchain近似算法
-
cv2℃HAINAPPROXTC89KCOS : 使用teh-ChinIchain近似算法
-
-
-
cv2.drawContours( )
r=cv2.drawContours(),contours,contourldx,color[,thickness])
-
r : 目标图像,直接修改目标的像素点,实现绘制。
-
o : 原始图像
-
contours : 需要绘制的边缘数组。
-
contourldx : 需要绘制的边缘索引,如果全部绘制则为一1。
-
color : 绘制的颜色,为BGR格式的Scalar。
-
thickness : 可选,绘制的密度,即描绘轮廓时所用的画笔粗细。
-
39. 直方图
-
普通直方图
- 横坐标: 图像中各个像素点的灰度级(0~255,每一个就是一个灰度级)
- 纵坐标: 具有该灰度级的像素个数
-
归一化直方图
- 横坐标: 图像中各个像素点的灰度级
- 纵坐标: 出现这个灰度级的概率
DIMS: 使用参数的数量
dism = 1
BINS: 参数子集的数目
[0, 255] = [0, 15]U[16,31]U……U[240,255]
范围 = bin1 U bin2 U ... U bin16
RANGE: 统计灰度值的范围,一般为[0,255]
最小值: 0, 黑色
最大值: 255, 白色
40. 绘制直方图
-
matplotlib
- pyplot: 提供了类似于matlab的绘图框架
- matplotlib.pyplot
- import matplotlib.pyplot as plt
-
函数ravel (把二维图像处理成一维数据)
- hist( 数据源, 像素级)
- 数据源:图像,必须是一维数组
- 像素级:一般是256,指[0,255]
- hist( 数据源, 像素级)
41. 使用OpenCV统计直方图
-
横坐标: [0, 255]
-
纵坐标: 各个灰度级的像素个数
[N0, N1, N2, …… N254, N255, ]
-
函数calcHist
-
一般形式: hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)
- hist: 直方图 (返回的直方图,是一个二维数组)
- images: 原始图像
- channels: 指定通道
- 通道编号需要用中括号括起来;
- 输入图像是灰度图时,它的值是[0];
- 彩色图像可以是[0], [1], [2] 分别对应通道 B, G, R
- mask: 掩码图像
- 统计整幅图像的直方图, 设为None
- 统计图像某一部分的直方图时,需要掩码图像
- histSize: BINS的数量
- 需要用中括号括起来
- ranges: 现估值范围RANGES
- accumulate: 累计标识(可选参数)
- 默认值为false
- 如果被设置为ture, 则直方图在开始分配时就不会被清零。
- 该参数允许从多个对象中算计单个直方图, 或者用于实时更新直方图
- 多个直方图的累积结果,用于对一组图像计算直方图。
例:hist = cv2.calcHist([img],[0],None,[256],[0,255]
-
42. 绘制OpenCV统计直方图
使用matplotlib 中的pyplot包
import matplotlib.pyplot as plt
x = [1,2,3,4,5,6]
y = [0.3,0.4,2,5.3,4.5,4]
plt.plot(x,y)
histb = cv2.calcHist([o].[0],None,[256],[0,256])
plt.plot(histb,color='b')
43. 使用掩膜的直方图
- 一般形式: hist = cv2.calcHist(images, channels, mask, histSize, ranges)
- hist: 直方图 (返回的直方图,是一个二维数组)
- images: 原始图像
- channels: 指定通道
- 通道编号需要用中括号括起来;
- 输入图像是灰度图时,它的值是[0];
- 彩色图像可以是[0], [1], [2] 分别对应通道 B, G, R
- mask: 掩码图像
- 统计整幅图像的直方图, 设为None
- 统计图像某一部分的直方图时,需要掩码图像
- histSize: BINS的数量
- 需要用中括号括起来
- ranges: 现估值范围RANGES
- accumulate: 累计标识(可选参数)
44. 掩膜原理及演示
-
或(or) : 并联 与(and) : 串联
mask = np.zeros(800, np.unit8)
mask[300: 500, 300,500] = 255
生成掩膜图形
计算结果 = cv2.bitwise_and(图像1, 图像2)
masked_img = cv2.bitwise_and(img, mask)