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()
|