图像像素统计和几何形状绘制

释放双眼,带上耳机,听听看~!
本文介绍了图像像素统计的基本知识和使用OpenCV API进行像素统计的方法,以及图像几何形状的绘制方法。

像素的统计

像素值统计涉及到的知识点有以下几个

  • 最小(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()

图像像素统计和几何形状绘制

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

SAM Adapter:提高SAM在特定任务上的性能

2023-11-26 11:35:14

AI教程

视频动作识别案例学习

2023-11-26 11:39:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索