圖像像素均值、方差
計(jì)算數(shù)組元素的均值和方差函數(shù)cv.meanStdDev()
袱院。傳入數(shù)組數(shù)據(jù)屎慢,返回?cái)?shù)組數(shù)據(jù)的均值和方差。在圖像數(shù)組中忽洛,可以計(jì)算出圖像數(shù)組的像素均值和方差腻惠。
使用np.min
和np.max
可以計(jì)算數(shù)組元素的最小值和最大值。在圖像數(shù)組中欲虚,可以計(jì)算每個(gè)通道像素最小值和最大值集灌。
以下面圖像為例,計(jì)算該圖像的像素均值和方差苍在,以及每個(gè)通道的像素最小值和最大值绝页。
# -*-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函數(shù)默認(rèn)換行荠商,可以用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))
# 若是一個(gè)空白圖像
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)
運(yùn)行結(jié)果:
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中一些幾何函數(shù)可以在圖像上繪制幾何形狀莱没,這些函數(shù)有:cv.rectangle()
,cv.circle()
酷鸦,cv.line()
饰躲,cv.putText()
。分別是繪制矩形臼隔、圓嘹裂、直線和文字。
關(guān)于這些函數(shù)的使用在這里不做過多贅述摔握。主要將以下cv.putText()
顯示中文亂碼的問題寄狼。
比如正常情況下我運(yùn)行: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)
解決方法:寫一個(gè)繪制文字的函數(shù)盛正,解決中文亂碼問題删咱。
# 彌補(bǔ)putText()顯示中文亂碼的問題
def image_add_text(img, text, left, top, text_color, text_size):
if isinstance(img, np.ndarray): # 判斷是否是opencv圖片類型,是就轉(zhuǎn)換Image類型
image = Image.fromarray(cv.cvtColor(img, cv.COLOR_BGR2RGB))
# 創(chuàng)建一個(gè)可以在給定圖像上繪制的對(duì)象
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)
# 轉(zhuǎn)換回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
# 彌補(bǔ)putText()顯示中文亂碼的問題
def image_add_text(img, text, left, top, text_color, text_size):
if isinstance(img, np.ndarray): # 判斷是否是opencv圖片類型痰滋,是就轉(zhuǎn)換Image類型
image = Image.fromarray(cv.cvtColor(img, cv.COLOR_BGR2RGB))
# 創(chuàng)建一個(gè)可以在給定圖像上繪制的對(duì)象
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)
# 轉(zhuǎn)換回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()
結(jié)果成功顯示中文敲街。完美!
更多計(jì)算機(jī)視覺知識(shí)袜刷,請(qǐng)關(guān)注微信公眾號(hào) “AI與計(jì)算機(jī)視覺”聪富。