13图像统计信息

像素值统计-均值

•cv.mean(src[, mask] ) ->retval

像素值统计-方差

•cv.meanStdDev(src[, mean[, stddev[, mask]]]) ->mean, stddev

像素值统计-极值

•cv.minMaxLoc(src[, mask]) ->minVal, maxVal, minLoc, maxLoc

•src表示输入图像,mask表示计算区域
•mean, stddev, minVal, maxVal分别表示均值,标准方差,最小与最大
•cv2.convertScaleAbs()函数通过线性变换将数据转为均值,然后转换成8位[uint8]

每个通道分别计算均值和方差

通过图像方差判断是否含有有效信息

调整图像对比度的本质是调整图像之间的差值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import cv2
import numpy as np

image = cv2.imread("123.jpg")
cv2.imshow("demo1",image)
bgr_m = cv2.mean(image)
sub_m = np.float32(image)[:, :] - (bgr_m[0],bgr_m[1],bgr_m[2])
result = sub_m * 0.5
result = result[:, :] + (bgr_m[0],bgr_m[1],bgr_m[2])
cv2.imshow("低对比度",cv2.convertScaleAbs(result))

# result = sub_m * 2.0
# result = result[:, :] + (bgr_m[0],bgr_m[1],bgr_m[2])
# cv2.imshow("高对比度",cv2.convertScaleAbs(result))

cv2.waitKey(0)
cv2.destroyAllWindows()

14图像几何形状绘制

•支持绘制线、矩形、圆形

•支持填充矩形、圆形、椭圆

•支持绘制文本(不支持中文)

•相关函数cv.line()cv.circle()cv.rectangle()cv.ellipse()cv.putText()

•相关参数解释:

•img表示输入图像

•color表示颜色,如(255, 0,0)表示蓝色(必须与img的通道匹配)

•thickness表示线宽, 大于0表示绘制,小于0表示填充

•lineType表示渲染模式, 默认LINE_8(渲染周围8个点即8连通像素,性能有限使用), LINE_AA表示反锯齿(质量更高)

文本绘制

putText 默认只支持英文

•org表示文字起始坐标点

•fontFace表示字体类型

•fontScale表示字体大小

计算文本区域大小

1
2
3
4
5
6
7
8
9
10
11
12
#函数计算文本区域大小函数
getTextSize(

text, # 表示文本信息

fontFace, # 表示字体类型

fontScale, # 表示字体大小

thickness # 表示线宽
)
#返回文本信息区域大小,与字体的基线baseline位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def paint():
canvas = np.zeros((512,512,3),dtype=np.uint8)

#动态合理显示文本区域
font_color = (140,199,0) #框颜色
cv.rectangle(canvas,(100,100),(300,300),font_color,2,8) #框

label_txt = "OpenCV"
font = cv.FONT_HERSHEY_SIMPLEX #字体
font_scale = 0.5 #字体大小
thickness = 1 #线宽
(fw, uph),dh = cv.getTextSize(label_txt,font,font_scale,thickness)
cv.rectangle(canvas,(100,100-uph-dh),(100+fw,100),(255,255,255),-1,8)
cv.putText(canvas,label_txt,(100,100-dh),font,font_scale,(255,0,255),thickness)
cv.imshow("canvas",canvas)
cv.waitKey(0)

cv.waitKey(0)
cv.destroyAllWindows()

rectangle函数

cv2.rectangle(img, pt1, pt2, color, thickness, lineType, shift )

参数表示依次为:(图片,长方形框左上角坐标, 长方形框右下角坐标, 字体颜色,字体粗细)

在图片img上画长方形,坐标原点是图片左上角,向右为x轴正方向,向下为y轴正方向。左上角(x,y),右下角(x,y) ,颜色(B,G,R), 线的粗细

15随机数与随机颜色

Numpy随机数

•random.randint(low, high=None, size=None, dtype=int)

•Low表低值,high表示高值,size表示维度,dtype表示类型

•np.random.randint(256)

•np.random.randint(0, 256)

•表示产生0~255随机数,类型是int

•np.random.randint(0, 256, size=3) #size表示生成随机数的数量,用数组表示

随机噪声图

•cv.randn(dst, mean, stddev)

•生成目标图像dst

•噪声均值mean

•噪声方差stddev

•cv.randn(canvas, (40, 200, 140), (10, 50, 10)) #参数:图像,均值,方差

代码演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def rando():
canvas = np.zeros((512, 512, 3), dtype=np.uint8)
# random draw
while True:
b,g,r = np.random.randint(0, 256, size=3)
x1 = np.random.randint(0, 512)
x2 = np.random.randint(0, 512)
y1 = np.random.randint(0, 512)
y2 = np.random.randint(0, 512)
cv.rectangle(canvas,(x1,y1), (x2, y2), (int (b), int(g), int (r)), -1, 8)
cv.imshow( "canvas",canvas)
c = cv.waitKey(50)
if c == 27:
break
cv.rectangle(canvas, (0,0), (512, 512), (0, 0, 0),-1, 8)

16多边形填充与绘制

绘制函数

•cv.fillPoly(img, pts, color[, lineType[, shift[, offset]]]) ->img

•填充多边形

•cv.polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]] ) ->img

•绘制多边形

•pts表示一个或者多个点集,polylines支持一次绘制多个多边形

•color表示颜色

•thickness表示线宽,注意:必须大于0

•lineType 表示渲染方式

点集支持

•pts表示一个或者多个点集

•pts = []

•pts.append((100, 100))

•pts.append((200, 50))

•pts.append((280, 100))

•pts.append((290, 300))

•pts.append((50, 300))

•pts = np.asarray(pts, dtype=np.int32)

•print(pts.shape)

•要求:必须是CV_32S, 对应np.int32

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def paintmore():
canvas = np.zeros((512, 512, 3), dtype=np.uint8)
pts =[]
pts.append((100, 100))
pts.append((200, 50))
pts.append((280, 100))
pts.append((290, 300))
pts.append((50, 300))
pts = np.asarray(pts, dtype=np.int32) #必须是int32
print(pts.shape)

pts2 = []
pts2.append((300, 300))
pts2.append((400, 250))
pts2.append((500, 300))
pts2.append((500, 500))
pts2.append((250, 500))
pts2 = np.asarray(pts2, dtype=np.int32)
print(pts2.shape)

cv.polylines(canvas, [pts, pts2], True, (0, 0, 255), 2, 8)
cv.fillPoly(canvas, [pts, pts2], (255, 0, 0), 8, 0)
cv.imshow("poly-demo", canvas)
cv.waitKey(0)
cv.destroyAllWindows()