图像像素均值、方差
计算数组元素的均值和方差函数cv.meanStdDev()
。传入数组数据,返回数组数据的均值和方差。在图像数组中,可以计算出图像数组的像素均值和方差。
使用np.min
和np.max
可以计算数组元素的最小值和最大值。在图像数组中,可以计算每个通道像素最小值和最大值。
以下面图像为例,计算该图像的像素均值和方差,以及每个通道的像素最小值和最大值。
# -*-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)
可以显示正常。
一旦改成中文,就显示乱码。cv.putText(img1, '你好,世界', (50, 50), cv.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 2, 8)
解决方法:写一个绘制文字的函数,解决中文乱码问题。
# 弥补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()
结果成功显示中文。完美!
更多计算机视觉知识,请关注微信公众号 “AI与计算机视觉”。