<p>你所问的细节我还不太清楚——比如每幅图片中的正方形是否总是相同的大小,你是否事先知道给定图像中有多少个正方形,它们是否总是正方形(你将它们描述为“普通的”</em>)以及你是否真的想在每张图像中计算一种以上的颜色-你的例子是“浅绿色”</em>,但你似乎有一个数组<em>“先前建立的颜色”</em>,所以你不清楚你是否想知道该数组中每种颜色有多少像素</p>
<p>无论如何,让我们先尝试一下答案,使用<strong>OpenCV</strong>和基本Numpy索引来获得中心</p>
<pre><code>import cv2
import numpy as np
# Load an image
im = cv2.imread('Qcza1.png')
# Assume the swatches are 64x64 pixels
sw, sh = 64, 64
# Get colours at each swatch centre, so we start 1/2 a swatch in and step by a whole swatch
centres = im[sh//2::sh, sw//2::sw]
</code></pre>
<p>这给了我们这个大小为[4,6,3]的数组,因为Numpy数组是[高度、宽度、通道],我们有4个垂直的样本中心,6个水平的样本中心,每个都有3种颜色</p>
<pre><code>array([[[141, 244, 159],
[ 85, 202, 105],
[255, 255, 255],
[ 85, 202, 105],
[141, 244, 159],
[ 85, 202, 105]],
[[255, 255, 255],
[141, 244, 159],
[ 85, 202, 105],
[141, 244, 159],
[ 85, 202, 105],
[141, 244, 159]],
[[141, 244, 159],
[ 85, 202, 105],
[255, 255, 255],
[ 85, 202, 105],
[141, 244, 159],
[255, 255, 255]],
[[ 85, 202, 105],
[141, 244, 159],
[ 85, 202, 105],
[255, 255, 255],
[ 85, 202, 105],
[255, 255, 255]]], dtype=uint8)
</code></pre>
<p>如果您不熟悉Numpy索引,它基本上是:</p>
<pre><code>array[start:end:stride]
</code></pre>
<p>因此,在上面的代码中,我将从阵列的半个样本宽度开始(到达第一个样本的中心),然后使用等于样本宽度的步幅到达下一个中心</p>
<p>如果现在要统计具有颜色的样例中心的数量[141244159],可以执行以下操作:</p>
<pre><code>tally = np.sum(np.all(centres==[141,244,159], axis=-1))
</code></pre>
<p>获取结果<code>8</code></p>
<hr/>
<p>请注意,您可以使用<strong>Python Imaging Library</strong>PIL/Pillow来完成这一切,如果这对您来说更容易安装,请更换:</p>
<pre><code>import cv2
im = cv2.imread(...)
</code></pre>
<p>与:</p>
<pre><code>from PIL import Image
# Open PIL Image and make into Numpy array
im = np.array(Image.open(...).convert('RGB'))
</code></pre>
<p>请记住,<strong>OpenCV</strong>使用BGR排序,而<strong>PIL</strong>使用RGB,因此您要查找的三色组将被反转</p>
<hr/>
<p>我使用1000种独特的颜色生成了90000个10x10像素的样本图像,如下所示:</p>
<pre><code>import cv2
import numpy as np
# Define 10 possible values for R, G and B
vals = np.arange(0,255,26)
# Make 90,000 pixel image using approx 10*10*10 = 1000 colours
h, w = 200, 450
np.random.seed(42)
im = np.random.choice(vals, (h,w,3)).astype(np.uint8)
# Scale up to make swatches 10x10
sw, sh = 10, 10
im = cv2.resize(im, (w*sw, h*sh), 0, 0, interpolation=cv2.INTER_NEAREST)
</code></pre>
<p>然后我计时,得到了1.9ms,它发现了83个颜色为[0,78,156]的样本,这是你期望的90000个1000种颜色的样本:</p>
<pre><code>%%timeit
centres = im[sh//2::sh, sw//2::sw]
np.sum(np.all(centres==[0,78,156], axis=-1))
1.95 ms ± 30.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
</code></pre>