gpt4 book ai didi

python - 在 Python 中手动高效地创建图像直方图

转载 作者:太空宇宙 更新时间:2023-11-03 22:50:03 25 4
gpt4 key购买 nike

我想编写无需使用内置 Matplotlib hist 函数即可显示图像直方图的代码。

这是我的代码:

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

def manHist(img):
row, col = img.shape # img is a grayscale image
y = np.zeros((256), np.uint64)
for i in range(0,row):
for j in range(0,col):
y[img[i,j]] += 1
x = np.arange(0,256)
plt.bar(x,y,color="gray",align="center")
plt.show()

def main():
img = cv.imread("C:/Users/Kadek/Documents/MATLAB/2GS.jpg")
manHist(img)

main()

我的问题是,有没有更有效的方法来制作像素值频率数组而不使用 for 循环?

最佳答案

基于 NumPy 的矢量化解决方案将使用 np.bincount -

out = np.bincount(img.ravel(),minlength=256)

另一种基于 .sum() 的向量化方法-

out = (img.ravel() == np.arange(256)[:,None]).sum(1)

sample 运行以验证结果 -

In [155]: # Input image (512x512) as array
...: img = np.random.randint(0,255,(512,512))
...:
...: # Original code
...: row, col = img.shape
...: y = np.zeros((256), np.uint64)
...: for i in range(0,row):
...: for j in range(0,col):
...: y[img[i,j]] += 1
...:

In [156]: out1 = np.bincount(img.ravel(),minlength=256)

In [157]: out2 = (img.ravel() == np.arange(256)[:,None]).sum(1)

In [158]: np.allclose(y,out1)
Out[158]: True

In [159]: np.allclose(y,out2)
Out[159]: True

关于python - 在 Python 中手动高效地创建图像直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40073003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com