«Это 26-й день моего участия в ноябрьском испытании обновлений. Подробную информацию об этом событии см.:Вызов последнего обновления 2021 г."
предисловие
использоватьOpenCV
который предоставилcv2.calcHist()
Функции можно использовать для вычисления гистограмм. также,NumPy
иMatplotlib
Аналогичные функции предусмотрены и для создания гистограмм. Для повышения производительности давайте сравним эти функции, используяOpenCV
,NumPy
иMatplotlib
Создайте гистограммы, затем измерьте время выполнения каждого вычисления гистограммы и нанесите результаты на график, сравнивая различную эффективность вычисления гистограмм в разных библиотеках.
Сравнение гистограмм оттенков серого OpenCV, NumPy и Matplotlib
использоватьtimeit.default_timer
Измеряйте время выполнения, поскольку оно автоматически предоставляет системную платформу иPython
Лучшие часы, доступные в версии, чтобы использоватьtimeit.default_timer
Чтобы измерить время выполнения, сначала вам нужно его импортировать:
from timeit import default_timer as timer
Время выполнения программы можно рассчитать с помощью:
start = timer()
# 程序执行
end = timer()
execution_time = start - end
учитываяdefault_timer()
На измерения могут влиять другие программы, запущенные в то же время. Поэтому лучший способ получить точное время — повторить несколько раз и использовать лучшее время. Однако мы также можем использовать другие методы для измерения более точного времени, такие как многократное вычисление среднего значения или другие методы, которые более эффективны для предотвращения аномалий.Для простоты мы повторяем несколько раз и используем лучшее время.
А для расчета и сравнения гистограмм нам необходимо использовать следующие функции:
-
OpenCV
поставкаcv2.calcHist()
функция -
NumPy
который предоставилnp.histogram()
функция -
Matplotlib
который предоставилplt.hist()
функция
Код, используемый для расчета времени выполнения каждой из вышеперечисленных функций, показан ниже. Сначала импортируйте необходимые библиотеки:
import numpy as np
import cv2
from matplotlib import pyplot as plt
from timeit import default_timer as timer
Затем напишите функцию визуализации, чтобы отображать результаты выполнения на том же графике для лучшего сравнения:
def show_img_with_matplotlib(color_img, title, pos):
img_RGB = color_img[:, :, ::-1]
ax = plt.subplot(1, 4, pos)
plt.imshow(img_RGB)
plt.title(title)
plt.axis('off')
def show_hist_with_matplotlib_gray(hist, title, pos, color):
ax = plt.subplot(1, 4, pos)
plt.title(title)
plt.xlabel("bins")
plt.ylabel("number of pixels")
plt.xlim([0, 256])
plt.plot(hist, color=color)
plt.figure(figsize=(18, 6))
plt.suptitle("Comparing histogram (OpenCV, numpy, matplotlib)", fontsize=14, fontweight='bold')
Далее самая ответственная часть программы, использующая методы расчета гистограммы в разных библиотеках, и получение времени работы программы:
image = cv2.imread('example.png')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 计算 cv2.calcHist() 执行时间
start = timer()
hist = cv2.calcHist([gray_image], [0], None, [256], [0, 256])
end = timer()
# 乘以1000将单位转换为毫秒
exec_time_calc_hist = (end - start) * 1000
# 计算 np.histogram() 执行时间
start = timer()
hist_np, bin_np = np.histogram(gray_image.ravel(), 256, [0, 256])
end = timer()
exec_time_np_hist = (end - start) * 1000
# 计算 plt.hist() 执行时间
start = timer()
# 调用 plt.hist() 计算直方图
(n, bins, patches) = plt.hist(gray_image.ravel(), 256, [0, 256])
end = timer()
exec_time_plt_hist = (end - start) * 1000
Наконец, мы строим изображение в градациях серого и его гистограмму:
how_img_with_matplotlib(cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR), "gray", 1)
show_hist_with_matplotlib_gray(hist, "grayscale histogram (OpenCV)-" + str('% 6.2f ms' % exec_time_calc_hist), 2, 'm')
show_hist_with_matplotlib_gray(hist_np, "grayscale histogram (Numpy)-" + str('% 6.2f ms' % exec_time_np_hist), 3, 'm')
show_hist_with_matplotlib_gray(n, "grayscale histogram (Matplotlib)-" + str('% 6.2f ms' % exec_time_plt_hist), 4, 'm')
plt.show()
Как видно из приведенного выше примера,cv2.calcHist()
коэффициент скорости выполненияnp.histogram()
иplt.hist()
все быстро. Поэтому из соображений производительности при расчете гистограммы изображения можно использоватьOpenCV
функция.