图像像素均值、方差

计算数组元素的均值和方差函数cv.meanStdDev()。传入数组数据,返回数组数据的均值和方差。在图像数组中,可以计算出图像数组的像素均值和方差。

使用np.minnp.max可以计算数组元素的最小值和最大值。在图像数组中,可以计算每个通道像素最小值和最大值。

以下面图像为例,计算该图像的像素均值和方差,以及每个通道的像素最小值和最大值。
Opencv-Python图像像素均值、方差,绘制几何形状_数组

# -*-coding:utf-8-*-
"""
File Name: image_shape_painting.py
Program IDE: PyCharm
Date: 21:12
Create File By Author: Hong
"""
import cv2 as cv
import numpy as np

def pixel_operation(image_path: str):
    img = cv.imread(image_path, cv.IMREAD_COLOR)
    cv.imshow('input', img)

    # 注意:python中的print函数默认换行,可以用end=''或者接任意字符
    # 像素均值、方差
    means, dev = cv.meanStdDev(img)
    print('means: {}, \n dev: {}'.format(means, dev))
    # 像素最大值和最小值
    min_pixel = np.min(img[:, :, 0])
    max_pixel = np.max(img[:, :, -1])
    print('min: {}, max: {}'.format(min_pixel, max_pixel))

    # 若是一个空白图像
    blank = np.zeros((300, 300, 3), dtype=np.uint8)
    # 像素均值、方差
    # blank[:, :] = (255, 0, 255)
    means, dev = cv.meanStdDev(blank)
    print('means: {}, \n dev: {}'.format(means, dev))

    cv.waitKey(0)
    cv.destroyAllWindows()


if __name__ == '__main__':
    path = 'images/2.png'
    pixel_operation(path)

运行结果:

means: [[182.14066441]
 [159.24370946]
 [144.10951802]], 
 dev: [[49.00258211]
 [44.59737827]
 [38.95002303]]
min: 14, max: 255
means: [[0.]
 [0.]
 [0.]], 
 dev: [[0.]
 [0.]
 [0.]]

绘制几何形状

使用opencv中一些几何函数可以在图像上绘制几何形状,这些函数有:cv.rectangle()cv.circle()cv.line()cv.putText()。分别是绘制矩形、圆、直线和文字。

关于这些函数的使用在这里不做过多赘述。主要将以下cv.putText()显示中文乱码的问题。

比如正常情况下我运行:cv.putText(img1, 'Hello, World!', (50, 50), cv.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 2, 8)
可以显示正常。
Opencv-Python图像像素均值、方差,绘制几何形状_opencv_02
一旦改成中文,就显示乱码。cv.putText(img1, '你好,世界', (50, 50), cv.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 2, 8)
Opencv-Python图像像素均值、方差,绘制几何形状_最小值_03
解决方法,写一个绘制文字的函数,解决中文乱码问题。

# 弥补putText()显示中文乱码的问题
def image_add_text(img, text, left, top, text_color, text_size):
    if isinstance(img, np.ndarray): # 判断是否是opencv图片类型,是就转换Image类型
        image = Image.fromarray(cv.cvtColor(img, cv.COLOR_BGR2RGB))

    # 创建一个可以在给定图像上绘制的对象
    draw = ImageDraw.Draw(image)
    # 字体的格式
    font_style = ImageFont.truetype("font/simsun.ttc", text_size, encoding='utf-8')
    # 绘制文本
    draw.text((left, top), text, text_color, font=font_style)
    # 转换回opencv格式并返回
    return cv.cvtColor(np.asarray(image), cv.COLOR_RGB2BGR)

完整代码:绘制几何形状和文字。

# -*-coding:utf-8-*-
"""
File Name: image_shape_painting.py
Program IDE: PyCharm
Date: 21:12
Create File By Author: Hong
"""
import cv2 as cv
import numpy as np
from PIL import Image, ImageDraw, ImageFont


# 弥补putText()显示中文乱码的问题
def image_add_text(img, text, left, top, text_color, text_size):
    if isinstance(img, np.ndarray): # 判断是否是opencv图片类型,是就转换Image类型
        image = Image.fromarray(cv.cvtColor(img, cv.COLOR_BGR2RGB))

    # 创建一个可以在给定图像上绘制的对象
    draw = ImageDraw.Draw(image)
    # 字体的格式
    font_style = ImageFont.truetype("font/simsun.ttc", text_size, encoding='utf-8')
    # 绘制文本
    draw.text((left, top), text, text_color, font=font_style)
    # 转换回opencv格式并返回
    return cv.cvtColor(np.asarray(image), cv.COLOR_RGB2BGR)


def drawing_demo():
    img1 = np.zeros((512, 512, 3), dtype=np.uint8)

    temp = np.copy(img1)
    # 绘制矩形
    cv.rectangle(img1, (50, 50), (400, 400), (0, 0, 255), 4, 8, 0)
    # 绘制圆形
    cv.circle(img1, (200, 200), 100, (255, 0, 0), -1, 8, 0)
    # 绘制直线
    cv.line(img1, (50, 50), (400, 400), (0, 255, 0), 2, 8, 0)
    # 写文字
    # cv.putText(img1, '你好,世界', (50, 50), cv.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 2, 8)
    img1 = image_add_text(img1, '你好,世界', 50, 50, (255, 0, 0), 20)

    # # 擦除
    # # 方法1
    # img1[:, :, :] = 0
    # # 方法2
    # img1 = temp

    cv.imshow('input', img1)

    cv.waitKey(0)
    cv.destroyAllWindows()


if __name__ == '__main__':
    path = 'images/2.png'
    drawing_demo()

结果成功显示中文。完美!
Opencv-Python图像像素均值、方差,绘制几何形状_最小值_04
更多计算机视觉知识,请关注微信公众号 “AI与计算机视觉”。