像素的统计
像素值统计涉及到的知识点有以下几个
- 最小(min)
- 最大(max)
- 均值(mean)
- 标准方差(standard deviation)
OpenCV 相关的 API 知识点
- 最大最小值 minMaxLoc
- 计算均值与标准方差 meanStdDev
代码:
def stats_demo():
img = cv2.imread("test.jpg", cv2.IMREAD_GRAYSCALE)
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(img)
print(minVal, maxVal, minLoc, maxLoc) # 0.0 255.0 (295, 110) (0, 0)
means, stddev = cv2.meanStdDev(img)
print(means, stddev) # [[226.50121333]] [[62.48617809]]
img[np.where(img < means)] = 0
img[np.where(img > means)] = 255
cv2.imshow("binary", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像几何形状绘制
图像公共参数说明
参数说明
- img 表示输入图像,允许单通道灰度图像或多通道彩色图像。
- color 表示绘制直线的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量。
- thickness 表示绘制直线的粗细,默认值 1px,-1 表示内部填充。
- lineType 表示绘制直线的线性,默认为 LINE_8。
- shift 表示点坐标的小数位数,默认为 0。
lineType 值说明
- cv.FILLED 表示内部填充(实心图形)。
- cv.LINE_4 表示 4 邻接线型。
- cv.LINE_8 表示 8 邻接线型。
- cv.LINE_AA 表示抗锯齿线型,图像更平滑。
绘制直线 cv.line 函数说明
cv.line() 函数使用
cv.line(img, pt1, pt2, color[, thickness=1, lineType=LINE_8, shift=0]) → img
参数说明
- img 表示输入图像,允许单通道灰度图像或多通道彩色图像。
- pt1 表示线段第一个点的坐标,(x1, y1)。
- pt2 表示线段第二个点的坐标,(x2, y2)。
- color 表示绘制直线的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量。
- thickness 表示绘制直线的粗细,默认值 1px,-1 表示内部填充。
- lineType 表示绘制直线的线性,默认为 LINE_8。
- shift 表示点坐标的小数位数,默认为 0。
注意
- 绘图操作会直接对传入的图像 img 进行修改,是否接受函数返回值都可以。
- 在绘制直线时不能选择填充线型 cv.FILLED ,否则会报错。
- 图像尺寸较小时,LINE_4 线型存在明显的锯齿,LINE_AA 线型更加平滑。
- 图像尺寸较大时,则线型的影响并不大,推荐采用默认值 LINE_8。
- 如果设置了 thickness,关键词 lineType 可以省略;如果没有设置 thickness,则关键词 lineType 不能省略,否则输入的线型参数会被错误地解释为线宽。
绘制圆形 cv.circle 函数说明
cv.circle() 函数使用
cv.circle(img, center, radius, color[, thickness=1, lineType=LINE_8, shift=0]) → img
参数说明
-
img 表示输入图像,允许单通道灰度图像或多通道彩色图像。
-
center 表示圆心点的坐标,(x, y) 格式的元组。
-
radius 表示圆的半径,整数。
-
color 表示绘制直线的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量。
-
thickness 表示绘制直线的粗细,默认值 1px,-1 表示内部填充。
-
lineType 表示绘制直线的线性,默认为 LINE_8。
-
shift 表示点坐标的小数位数,默认为 0。
注意 -
在单通道的灰度图像上只能绘制灰度线条,不能绘制彩色线条 。但是,线条颜色 color 可以是标量 b,也可以是元组 (b,g,r),都会被解释为灰度值 b。元组中的后两个通道的参数是无效的。
绘制矩形 cv.rectangle 函数说明
cv.rectangle() 函数使用
cv.rectangle(img, pt1, pt2, color[, thickness=1, lineType=LINE_8, shift=0]) → img
参数说明
- img 表示输入图像,允许单通道灰度图像或多通道彩色图像。
- pt1 表示矩阵第一个点的坐标,(x1, y1) 格式的元组。
- pt2 表示与 pt1 成对角的矩阵第二个点的坐标,(x2, y2) 格式的元组。
- color 表示绘制直线的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量。
- thickness 表示绘制直线的粗细,默认值 1px,-1 表示内部填充。
- lineType 表示绘制直线的线性,默认为 LINE_8。
- shift 表示点坐标的小数位数,默认为 0。
注意
- 使用rec参数绘制矩形,r.tl() 和 r.br() 是矩形的对角点。
绘制椭圆 cv.ellipse 函数说明
cv.ellipse() 函数使用
cv.ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness=1, lineType=LINE_8, shift=0]) → img
参数说明
- img 表示输入图像,允许单通道灰度图像或多通道彩色图像。
- center 表示椭圆的圆心点的坐标,(x, y) 格式的元组。
- axes 表示椭圆的轴长,格式为 (长轴长度的一半, 短轴长度的一半) 格式的元组。
- angle 表示椭圆沿水平方向逆时针旋转的角度。
- startAngle 表示沿长轴顺时针方向开始显示的角度。
- endAngle 表示沿长轴顺时针结束显示的角度。
- color 表示绘制直线的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量。
- thickness 表示绘制直线的粗细,默认值 1px,-1 表示内部填充。
- lineType 表示绘制直线的线性,默认为 LINE_8。
- shift 表示点坐标的小数位数,默认为 0。
代码:
def draw_demo():
canvas = np.zeros((512, 512, 3), dtype=np.uint8)
font_color = (140, 199, 0)
cv2.rectangle(canvas, (100, 100), (300, 300), font_color, 2, 8)
label_text = 'openCv'
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 0.5
thickness = 1
(fw, uph), dh = cv2.getTextSize(label_text, font, font_scale, thickness)
cv2.rectangle(canvas, (100, 100 - uph - dh), (100 + fw, 100), (255, 255, 255), -1, 8)
cv2.putText(canvas, label_text, (100, 100 - dh), font, font_scale, (255, 0, 255), thickness)
cv2.imshow('canvas', canvas)
cv2.waitKey(0)
cv2.destroyAllWindows()
Python中的随机数函数
random.randint(low, high=None, size=Nonedtype=int)
Low表低值,high表示高值,size表示维度,dtype表示类型
np.random.randint(256)np.random.randint(0,256)表示产生0~255随机数,类型是int
np.random.randint(0, 256, size=3)
def noise_demo():
canvas=np.zeros((250,600,3),dtype=np.uint8)
img=cv2.imread('test.jpg')
print(img.shape)
cv2.randn(canvas,(120,100,140),(30,50,20))
dst=cv2.add(img,canvas)
cv2.imshow('add noise',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
多边形填充与绘制
在使用 opencv 绘制几何图像时,除了大多数情况下绘制的简单形状,有时也需要绘制复杂的多边形形状。下面就来一起尝试如何绘制多边形形状。
首先需要了解几个 opencv 库函数。
cv.polylines()
多边形绘制
需要传入画布、轮廓点、是否闭合、绘制颜色、线条粗细、线条类型、顶点坐标小数位。cv.fillPoly()
多边形填充
需要传入画布、轮廓点、填充颜色、线条类型、顶点坐标小数位。drawContours()
既可以填充也可以绘制多边形
需要传入画布(三通道画布才能显示轮廓)、轮廓点、绘制轮廓数(-1 表示绘制其中的所有轮廓)、颜色、轮廓粗细(-1 表示填充)。
def polygon_drawing():
canvas = np.zeros((512, 512, 3), dtype=np.uint8)
# 定义多边形的顶点
pts = np.array([[100, 100], [350, 100], [450, 280], [320, 450], [80, 400]], dtype=np.int32)
# 多边形绘制
# cv.polylines(canvas, [pts], True, (0, 0, 255), 2, 8, 0)
# 多边形填充
# cv.fillPoly(canvas, [pts], (255, 0, 255), 8, 0)
# 既可以填充也可以绘制形状, thickness为时绘制形状,-1时填充形状
# 可以添加多个轮廓,用,号隔开,比如[pts1, pts2, ...]
cv.drawContours(canvas, [pts], -1, (255, 0, 0), thickness=-1)
cv.imshow('polyline', canvas)
cv.waitKey(0)
cv.destroyAllWindows()