<p>要计算具有给定颜色的连续区域数,请执行以下操作:</p>
<ul>
<li>首先找出哪些像素具有该颜色</li>
<li>然后使用连接组件分析来计算连续区域的数量</李>
</ul>
<p>大多数图像处理库都具有轻松完成此任务所需的工具。例如,使用<a href="https://diplib.org" rel="nofollow noreferrer">DIPlib</a>(披露:我是一名作者)将是:</p>
<pre class="lang-py prettyprint-override"><code>import diplib as dip
img = dip.ImageRead('Qcza1.png')
color = dip.Create0D([159,244,141])
squares = dip.AllTensorElements(img == color)
squares = dip.Label(squares, connectivity=1)
count = dip.Maximum(squares)[0][0]
</code></pre>
<p>对于OpenCV,它将是:</p>
<pre class="lang-py prettyprint-override"><code>import cv2
img = cv2.imread('Qcza1.png') # Uses BGR ordering!
color = (141,244,159)
squares = cv2.inRange(img, color, color)
count, squares = cv2.connectedComponents(squares, connectivity=4)
count = count - 1 # count included background label
</code></pre>
<hr/>
<p>这里有两件事可能出错:</p>
<ol>
<li><p>颜色不精确(照明变化、压缩瑕疵等)。在这种情况下,您需要使用一系列颜色(<code>dip.InRange(img, color1, color2)</code>而不是<code>img == color</code>或<code>cv2.inRange(img, color1, color2)</code>)</p>
</li>
<li><p>正方形并不像示例中那样完全分开。如果连接只发生在顶点,那么在标记之前对二进制<code>squares</code>图像进行一点侵蚀就可以解决这个问题。如果正方形可以并排排列,则需要一种更复杂的方法:我们将查看大小的直方图,期望看到单个正方形大小的第一个峰值,以及该大小倍数的进一步峰值。根据这个直方图,我们可以计算出有多少个正方形,方法是将2倍大小附近的箱子乘以2,3倍大小附近的箱子乘以3,等等,然后将我们的所有值相加</p>
</li>
</ol>