【发布时间】:2017-02-25 15:32:03
【问题描述】:
我想编写无需使用内置 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 解决方案会快几个数量级
-
所以,您没有像以前那样使用通道的第三轴:
y[img[i,j]]? -
您可以为此使用
collections.Counter,尽管这对您来说可能不够“手动”。 -
@FranciscoCouzo 感谢您的建议,但我不明白如何使用矢量化 numpy。
-
@Divakar 是的,这是一张灰度图像。
标签: python opencv numpy image-processing matplotlib