python-3.x - 当我想要索引的出现时如何使用 numpy.hist
问题描述
我有一组图像,我想在每个图像的色调值上创建一个直方图。因此,我创建了一个长度为 180 的数组。如果色调值在图像中,则在每个单元格中添加 1。最后,我得到了每个色调值出现的数组,但是当我使用 numpy.hist 时,y 轴是色调值,x 轴是出现次数。但我想反过来。
这是我的代码:
path = 'path'
sub_path = 'subpath'
sumHueOcc = np.zeros((180, 1), dtype=int)
print("sumHue Shape")
print(sumHueOcc.shape)
for item in dirs:
fullpath = os.path.join(path,item)
pathos = os.path.join(sub_path,item)
if os.path.isfile(fullpath):
img = np.array(Image.open(fullpath))
f, e = os.path.splitext(pathos)
imgHSV = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
print("Img shape")
print(img.shape)
# want to work with hue only
h, s, v = cv2.split(imgHSV)
# the hue values in one large array
Z = h.reshape((-1, 1))
# convert to np.float32
Z = np.uint32(Z)
# add 1 for each hue value in the image
for z in Z:
sumHueOcc[z] = sumHueOcc[z] + 1
plt.figure(figsize=(9, 8))
plt.subplot(311) # Hue Picture 1
plt.subplots_adjust(hspace=.5)
plt.title("Hue Picture 1")
plt.hist(np.ndarray.flatten(h), bins=180)
plt.subplot(312) # Hue Picture 2
plt.subplots_adjust(hspace=.5)
plt.title("Hue Picture 2")
plt.hist(np.ndarray.flatten(Z), bins=180)
plt.subplot(313) # Hue Picture 2
plt.subplots_adjust(hspace=.5)
plt.title("Sum Occ")
plt.hist(np.ndarray.flatten(sumHueOcc), bins=180)
plt.show()
#First Hue Sum
plt.figure(figsize=(9,8))
plt.title("Sum Hue Occ")
plt.hist(np.ndarray.flatten(sumHueOcc), bins=180)
plt.show()
这是从半色调更改为全色调的 Berriels 代码:
print(glob.glob('path with my 4 images'))
# list of paths to the images
image_fname_list = glob.glob('path with my 4 images')
# var to accumulate the histograms
total_hue_hist = np.zeros((359,))
for image_fname in image_fname_list:
# load image
img = cv2.imread(image_fname)
# convert from BGR to HSV
img = np.float32(img)
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV_FULL)
# get the Hue channel
#hue = img_hsv[:, :, 0]
hue, sat, val = cv2.split(img_hsv)
# show histogram
hist, bin_edges = np.histogram(hue, bins=range(360))
total_hue_hist += hist
plt.bar(list(range(359)), hist)
plt.show()
解决方案
你可以这样做:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# load image
img = cv2.imread('lenna.png')
# convert from BGR to HSV
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# get the Hue channel
hue = img_hsv[:, :, 0]
# show histogram
hist, bin_edges = np.histogram(hue, bins=range(180))
plt.bar(bin_edges[:-1], hist)
plt.show()
如果您不需要直方图值,您可以这样做:
import cv2
import matplotlib.pyplot as plt
# load image
img = cv2.imread('lenna.png')
# convert from BGR to HSV
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# get the Hue channel
hue = img_hsv[:, :, 0]
# show histogram
plt.hist(hue.flatten(), bins=range(180))
plt.show()
输入(lenna.png
):
输出:
如果您有多个图像,则可以执行以下操作:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# list of paths to the images
image_fname_list = ['lenna.png', 'other_image.png', ...]
# var to accumulate the histograms
total_hue_hist = np.zeros((179,))
for image_fname in image_fname_list:
# load image
img = cv2.imread(image_fname)
# convert from BGR to HSV
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# get the Hue channel
hue = img_hsv[:, :, 0]
# show histogram
hist, bin_edges = np.histogram(hue, bins=range(180))
total_hue_hist += hist
plt.bar(list(range(179)), hist)
plt.show()
推荐阅读
- arduino-uno - LCD显示奇怪的神秘字符
- python - eth-brownie 'Accounts' 对象没有属性 'connect_to_clef'
- javascript - 我在添加新对象来存储 React redux 时遇到问题
- python - mmdevice 音频输出错误:无法初始化 COM(错误 0x80010106)
- php - 将当前用户发送到 laravel 中的工作
- ios - Flutter:当用户没有注册卡时如何添加设置Apple Pay按钮功能
- git - Git 没有将我的一个项目推送到 Github
- python - 在带有热图的pytorch上显示带有结果的数据集?
- python - 使用 pyclick 的 HumanCurve 移动光标时,速度参数无效
- javascript - 如何使用 Leaflet.Draw 添加和保存折线并在代码中重用?