我有一个python图像处理函数,它使用try 获取图像的主色.我使用了我在这里找到的一个函数

它是有效的,但不幸的是,我不太明白它的作用,我了解到np.histogram相当慢,我应该使用cv2.calcHist,因为它比https://docs.opencv.org/trunk/d1/db7/tutorial_py_histogram_begins.html快40倍

我想了解如何更新代码以使用cv2.calcHist或更好的值,我必须输入哪些值.

我的职能

def centroid_histogram(clt):
    # grab the number of different clusters and create a histogram
    # based on the number of pixels assigned to each cluster
    num_labels = np.arange(0, len(np.unique(clt.labels_)) + 1)
    (hist, _) = np.histogram(clt.labels_, bins=num_labels)

    # normalize the histogram, such that it sums to one
    hist = hist.astype("float")
    hist /= hist.sum()

    # return the histogram
    return hist

clt中的pprint是这个,不确定这是否有用

KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
    n_clusters=1, n_init=10, n_jobs=1, precompute_distances='auto',
    random_state=None, tol=0.0001, verbose=0)

我的代码可以在这里找到:https://github.com/primus852/python-movie-barcode

非常感谢初学者的帮助.

根据要求:

样本图像

Sample

最主要的 colored颜色 :

rgb(22,28,37)

直方图的计算时间:

0.021515369415283203s

推荐答案

可以建议使用np.uniquenp.bincount两种方法来获得最主要的 colored颜色 .此外,在链接页面中,它还提到bincount是一个更快的替代方案,因此这可能是一条可行的道路.

Approach #1

def unique_count_app(a):
    colors, count = np.unique(a.reshape(-1,a.shape[-1]), axis=0, return_counts=True)
    return colors[count.argmax()]

Approach #2

def bincount_app(a):
    a2D = a.reshape(-1,a.shape[-1])
    col_range = (256, 256, 256) # generically : a2D.max(0)+1
    a1D = np.ravel_multi_index(a2D.T, col_range)
    return np.unravel_index(np.bincount(a1D).argmax(), col_range)

1000 x 1000张密集范围[0,9)的彩色图像进行验证和计时,以获得可重复的结果-

In [28]: np.random.seed(0)
    ...: a = np.random.randint(0,9,(1000,1000,3))
    ...: 
    ...: print unique_count_app(a)
    ...: print bincount_app(a)
[4 7 2]
(4, 7, 2)

In [29]: %timeit unique_count_app(a)
1 loop, best of 3: 820 ms per loop

In [30]: %timeit bincount_app(a)
100 loops, best of 3: 11.7 ms per loop

Further boost

利用multi-core with numexpr module%的数据量进一步提升-

import numexpr as ne

def bincount_numexpr_app(a):
    a2D = a.reshape(-1,a.shape[-1])
    col_range = (256, 256, 256) # generically : a2D.max(0)+1
    eval_params = {'a0':a2D[:,0],'a1':a2D[:,1],'a2':a2D[:,2],
                   's0':col_range[0],'s1':col_range[1]}
    a1D = ne.evaluate('a0*s0*s1+a1*s0+a2',eval_params)
    return np.unravel_index(np.bincount(a1D).argmax(), col_range)

时间安排-

In [90]: np.random.seed(0)
    ...: a = np.random.randint(0,9,(1000,1000,3))

In [91]: %timeit unique_count_app(a)
    ...: %timeit bincount_app(a)
    ...: %timeit bincount_numexpr_app(a)
1 loop, best of 3: 843 ms per loop
100 loops, best of 3: 12 ms per loop
100 loops, best of 3: 8.94 ms per loop

Python-3.x相关问答推荐

PYSMB中的进度条

文件名中的文件打开和撇号

查找值始终为零的行 pandas

SQL Server 2022和Python3.10脚本错误

在一行中读写一个csv文件

列出相同索引的Pandas

用于 BIG 数组计算的多处理池映射比预期的要慢

运行 pip install -r requirements.txt 时出错

python 3:如何判断一个对象是否是一个函数?

使用 distutils 分发预编译的 python 扩展模块

Tkinter AttributeError:对象没有属性'tk'

是否有与 Laravel 4 等效的 python?

tensorflow 中 numpy.newaxis 的替代方案是什么?

如何编写可 Select 充当常规函数的 asyncio 协程?

Python中的多行日志(log)记录

Python 3.5:async with导致 SyntaxError.为什么?

为现有项目创建virtualenv

如何在python中创建代码对象?

python中的绝对导入是什么?

在动态链接库 Anaconda3\Library\bin\mkl_intel_thread.dll 中找不到序数 242