opencv十四天入门学习——task4

前言

opencv入门学习第四次学习任务。本次学习我主要又学习了opencv中图像统计信息中的均值、方差、极值的统计函数,学习了图像几何形状绘制与多边形绘制,以及相应的填充方法,实践了文本绘制,并且了解了opencv与图像噪声相关的知识。本次学习仍然以实践为主,熟悉各个API函数的使用,熟悉使用中的注意点。

1、图像像素值统计信息

(1)均值:灰度图像计算图像的灰度平均值,彩色图像先计算每个通道的平均值后计算图像整体平均值,反映一幅图像的平均亮度。

函数:cv.mean(src[, mask] ) ->retval(src:输入图像,mask:计算区域)

(2)方差: 数据的分散程度(偏离均值) ,反映图像像素值与均值的离散程度。

函数:cv.meanStdDev(src[, mean[, stddev[, mask]]]) ->mean, stddev

(3)极值: 单通道图像的最大和最小值,反映了最亮最暗的点。

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

实验代码:

import cv2 as cv
import numpy as np

#对比度演示
image1 = cv.imread("./apple.jpg")
cv.imshow("apple", image1)
bgr_m = cv.mean(image1)
sub_m = np.float32(image1)[:, :]-(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])
cv.imshow("low-contrast-butterfly", cv.convertScaleAbs(result))
result = sub_m * 2.0
result = result[:, :]+(bgr_m[0], bgr_m[1], bgr_m[2])
cv.imshow("high-contrast-butterfly", cv.convertScaleAbs(result))

#极值演示
roi = np.array([[5, 3, 4], [9, 6, 7], [8, 2, 3]],dtype=np.uint8)
mask = np.array([[0, 1, 0], [0, 1, 0], [0, 1, 0]],dtype=np.uint8)
m1 = cv.mean(roi)
m2 = cv.meanStdDev(roi, mask=mask)
print(roi, "\n", mask)
print(m1, "\n", m2)
min, max, min_loc, max_loc = cv.minMaxLoc(roi)
print(min, max, min_loc, max_loc)

cv.waitKey(0)
cv.destroyAllWindows()

实验结果:

在这里插入图片描述

2、图像几何形状绘制

opencv支持绘制线性、矩形、圆形,也支持对绘制图形进行颜色填充,支持绘制文本。相关函数有cv.line()、cv.circle、cv.rectangle()、cv.ellipse()、cv.putText(),参数img表示输入图像,color表示颜色,thickness表示线宽, 大于0表示绘制,小于0表示填充,lineType表示渲染模式, 默认LINE_8, LINE_AA表示反锯齿。

文本绘制putText默认只支持英文,org表示文字起始坐标点,fontFace表示字体类型,fontScale表示字体大小。计算文本区域大小函数getTextSize () ,参数text表示文本信息、fontFace表示字体类型、fontScale表示字体大小、thickness表示线宽,返回文本信息区域大小与字体的基线baseline位置。

实验代码:

import cv2 as cv
import numpy as np
canvas0 = np.zeros((512, 512, 3), dtype=np.uint8)
canvas = np.zeros((512, 512, 3), dtype=np.uint8)
cv.rectangle(canvas0, (100, 100), (300, 300), (0, 0, 255), 2, 8)
cv.circle(canvas0, (250, 250), 50, (255, 0, 0), 4, cv.LINE_8)
cv.putText(canvas0, "Hello,opencv-python", (100, 100), cv.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 255), 1)
cv.imshow("canvas0", canvas0)

font_color = (140,199,0)
cv.rectangle(canvas, (100, 100), (300, 300),font_color, 2, 8)
label_txt = "OpenCV-Python"
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.destroyAllWindows()

实验演示:

在这里插入图片描述

3、随机数与随机颜色

Numpy中可以使用random.randint函数生成随机数,opencv提供随机噪声图的函数cv.randn(dst, mean, stddev),dst表示生成目标图像,mean表示噪声均值,stddev表示噪声方差。

实验代码:

import cv2 as cv
import numpy as np
canvas = np.zeros((512, 512, 3), dtype=np.uint8)

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)
image = cv.imread("./apple.jpg")
cv.imshow("input", image)
cv.randn(canvas, (12, 12, 12), (30, 30, 30))
dst = cv.add(image, canvas)
cv.imshow("add noise image", dst)


cv.waitKey(0)
cv.destroyAllWindows()

实验结果:
在这里插入图片描述

4、多边形填充与绘制

填充多边形函数:cv.fillPoly(img, pts, color[, lineType[, shift[, offset]]]) ->img
绘制多边形函数:cv.polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]] ) ->img
pts表示一个或者多个点集,必须是CV_32S(np.int32)
color表示颜色
thickness表示线宽,注意:必须大于0
lineType 表示渲染方式

实验代码:

import cv2 as cv
import numpy as np
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)
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()

实验结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独孤西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值