python - 如何将 OpenCV 直方图保存到 Python 文件中?

标签 python python-2.7 opencv

我想从文件中保存计算出的直方图,这样我就可以重新打开它而不必重新计算它,但我不确定我将如何保存然后再次读取它。

image_path = "/Users/..../test.jpg"
image = cv2.imread(image_path, 0)
if image is not None: 
    hist = cv2.calcHist([image], [0], None, [256], [0, 256])
    cv2.imwrite("/Users/.../hist.jpg", hist) # What should this be?

hist = cv2.imread("/Users/.../hist.jpg", 0) # And this?

编辑: 所以我想做这样的事情,但我不确定语法是什么。

with open('hist.txt', 'a') as fp:
    fp.write('%s %s %s', [hist_id, list(hist), color])
with open('hist.txt', 'r') as fp:
    lines = fp.readlines()
    for line in lines: 
        hist_id = line[0]
        hist = np.array(eval(line[1]))
        color = line[2]
        cv2.compare(hist.....) 

编辑 2:

new_entry = [image, list(hist1), list(hist2)]
for item in new_entry:
    fd.write("%s\t" % item)
fd.write("\n")

with open('hist.txt', 'r') as fd:
     lines = fd.readlines()
     for line in lines:
         line = line.split('\t')
         cv2.compareHist(numpy.array(line[1]), numpy.array(line[2]))

最佳答案

请注意 cv2.calcHist 返回一维数组,而不是图像,因此您不能使用 cv2.imwrite 保存它,而是使用标准数据文件,例如例如 CSV(逗号分隔值)。如果您可以为每个文件只存储一个直方图,最简单的解决方案是使用一个简单的文本文件:

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

image = cv2.imread(image_path)
hist = cv2.calcHist([image], [0], None, [256], [0,256])

with open('histo.txt', 'w') as file:
   file.write(list(hist))  # save 'hist' as a list string in a text file

然后:

with open('histo.txt', 'r') as file:
   hist = np.array(eval(file.read()) # read list string and convert to array

另一方面,如果您的目标不是保存而是绘制直方图,matplotlib 可能是最简单的工具。此代码片段绘制了图像的 R、G 和 B channel 的所有三个直方图:

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

image = cv2.imread(image_path)
colors = ('b','g','r')
for n, color in enumerate(colors):
    hist = cv2.calcHist([image], [n], None, [256], [0,256])
    plt.plot(hist, color=color)
    plt.xlim([0, 256])
plt.show()

关于python - 如何将 OpenCV 直方图保存到 Python 文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49310466/

相关文章:

visual-c++ - cxcore210d.dll丢失

android - Android 中的 OpenCV 管理器安装不工作,不支持 Ccamera

python pandas dataframe在读取excel文件时添加带有值的列

python - 使用装饰器时无法获取方法名称

python - 如何从 python 中的字符串中提取多子字符串?

python - 如果变量不是 None 并且大于一行中的某个值,如何检查 python?

python - 使用条件 python 查找最小值

python - Django 1.7 空白 CharField/TextField 约定

python - 使用pdb调试时可以查看python内置函数的源代码吗?

opencv - BFMatcher 和 FlannBasedMatcher 的区别