Jas*_*son 4 python opencv numpy histogram
我正在自学计算机图像处理的基础知识,同时我也在自学Python。
给定x具有3个通道的尺寸为2048x1354 的图像,可以有效地计算像素强度的直方图。
import numpy as np, cv2 as cv
img = cv.imread("image.jpg")
bins = np.zeros(256, np.int32)
for i in range(0, img.shape[0]):
for j in range(0, img.shape[1]):
intensity = 0
for k in range(0, len(img[i][j])):
intensity += img[i][j][k]
bins[intensity/3] += 1
print bins
Run Code Online (Sandbox Code Playgroud)
我的问题是这段代码运行缓慢,大约需要30秒。我如何才能加快速度并变得更Python化?
您可以使用较新的OpenCV python接口,该接口本机使用numpy数组,并使用matplotlib绘制像素强度的直方图hist。在我的计算机上花费的时间不到第二秒。
import matplotlib.pyplot as plt
import cv2
im = cv2.imread('image.jpg')
# calculate mean value from RGB channels and flatten to 1D array
vals = im.mean(axis=2).flatten()
# plot histogram with 255 bins
b, bins, patches = plt.hist(vals, 255)
plt.xlim([0,255])
plt.show()
Run Code Online (Sandbox Code Playgroud)

更新:超过指定数量的容器并不总是提供所需的结果,因为从实际值计算出最小值和最大值。此外,值254和255的计数在最后一个bin中求和。这是更新的代码,这些代码始终正确地绘制直方图,并以0..255为中心
import numpy as np
import matplotlib.pyplot as plt
import cv2
# read image
im = cv2.imread('image.jpg')
# calculate mean value from RGB channels and flatten to 1D array
vals = im.mean(axis=2).flatten()
# calculate histogram
counts, bins = np.histogram(vals, range(257))
# plot histogram centered on values 0..255
plt.bar(bins[:-1] - 0.5, counts, width=1, edgecolor='none')
plt.xlim([-0.5, 255.5])
plt.show()
Run Code Online (Sandbox Code Playgroud)

看一下 MatPlotLib。这应该会带你完成你想做的所有事情,并且没有 for 循环。
| 归档时间: |
|
| 查看次数: |
16958 次 |
| 最近记录: |