<p>你可以做一些修改使它更快。在</p>
<p>您的代码在我的笔记本电脑中需要以下时间:</p>
<pre><code>IPython CPU timings (estimated):
User : 50.92 s.
System : 0.01 s.
Wall time: 51.20 s.
</code></pre>
<p>我做了以下修改:</p>
<p>1-删除了函数<code>genHist</code>,并在<code>calcEntropy()</code>中实现了它。它将节省,可能是1或2秒。在</p>
<p>2-在查找日志之前,我只简单地将一个小值0.00001添加到hist,而不是<code>logs = np.nan_to_num(np.log2(hist))</code>。<code>logs = np.log2(hist+0.00001)</code>。它将保存<code>3-4 seconds</code>,但它会稍微改变您的输出。两个结果之间的最大误差是<code>0.0039062</code>。(所以这取决于你是否想要这个)</p>
<p>3-将<code>np.histogram</code>更改为<code>cv2.calcHist()</code>。<strong>它将节省多于<code>25 seconds</code>。</strong></p>
<p>现在,代码在我的笔记本电脑上花费了以下时间:</p>
^{pr2}$
<p>它是3倍以上的速度。在</p>
<p>代码:</p>
<pre><code>def calcEntropy(img):
#hist,_ = np.histogram(img, np.arange(0, 256), normed=True)
hist = cv2.calcHist([img],[0],None,[256],[0,256])
hist = hist.ravel()/hist.sum()
#logs = np.nan_to_num(np.log2(hist))
logs = np.log2(hist+0.00001)
#hist_loghist = hist * logs
entropy = -1 * (hist*logs).sum()
return entropy
img = cv2.imread("lena.jpg", 0)
result2 = np.zeros(img.shape, dtype=np.float16)
h, w = img.shape
subwin_size = 5
for y in xrange(subwin_size, h-subwin_size):
for x in xrange(subwin_size, w-subwin_size):
subwin = img[y-subwin_size:y+subwin_size, x-subwin_size:x+subwin_size]
#hist = genHist(subwin) # Generate histogram
entropy = calcEntropy(subwin) # Calculate entropy
result2.itemset(y,x,entropy)
</code></pre>
<p><strong>现在的主要问题是<code>two for loops</code>。我认为它是<code>Cython</code>实现的最佳候选方案,它将产生非常好的结果。</strong></p>