<p>我不确定,如果给定的图像与您的实际任务或数据相似,但是对于这种图像,您可以尝试简单的模板匹配,参见<a href="https://docs.opencv.org/4.5.2/d4/dc6/tutorial_py_template_matching.html" rel="nofollow noreferrer">this OpenCV tutorial</a></p>
<p>基本上,我只是对教程进行了一些修改:</p>
<pre class="lang-py prettyprint-override"><code>import cv2
import matplotlib.pyplot as plt
# Read images
examples = [cv2.imread(img) for img in ['ex1.png', 'ex2.png', 'ex3.png']]
target = cv2.imread('target.png')
h, w = target.shape[:2]
# Iterate examples
for i, img in enumerate(examples):
# Template matching
# cf. https://docs.opencv.org/4.5.2/d4/dc6/tutorial_py_template_matching.html
res = cv2.matchTemplate(img, target, cv2.TM_CCOEFF_NORMED)
# Get location of maximum
_, max_val, _, top_left = cv2.minMaxLoc(res)
# Set up threshold for decision target found or not
thr = 0.7
if max_val > thr:
# Show found target in example
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img, top_left, bottom_right, (0, 255, 0), 2)
# Visualization
plt.figure(i, figsize=(10, 5))
plt.subplot(1, 2, 1), plt.imshow(img[..., [2, 1, 0]]), plt.title('Example')
plt.subplot(1, 2, 2), plt.imshow(res, vmin=0, vmax=1, cmap='gray')
plt.title('Matching result'), plt.colorbar(), plt.tight_layout()
plt.show()
</code></pre>
<p>结果如下:</p>
<p><a href="https://i.stack.imgur.com/xXqqX.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/xXqqX.png" alt="Example 1"/></a></p>
<p><a href="https://i.stack.imgur.com/Eh0Kv.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Eh0Kv.png" alt="Example 2"/></a></p>
<p><a href="https://i.stack.imgur.com/DSD9z.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/DSD9z.png" alt="Example 3"/></a></p>
<pre class="lang-none prettyprint-override"><code>----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.16299-SP0
Python: 3.9.1
PyCharm: 2021.1.1
Matplotlib: 3.4.1
OpenCV: 4.5.1
----------------------------------------
</code></pre>
<hr/>
<p><strong>编辑:</strong>为了强调来自不同颜色的信息,可以使用来自<a href="https://en.wikipedia.org/wiki/HSL_and_HSV" rel="nofollow noreferrer">HSV color space</a>的色调通道进行模板匹配:</p>
<pre class="lang-py prettyprint-override"><code>import cv2
import matplotlib.pyplot as plt
# Read images
examples = [
[cv2.imread(img) for img in ['ex1.png', 'ex2.png', 'ex3.png']],
[cv2.imread(img) for img in ['ex12.png', 'ex22.png', 'ex32.png']]
]
targets = [
cv2.imread('target.png'),
cv2.imread('target2.png')
]
# Iterate examples and targets
for i, (ex, target) in enumerate(zip(examples, targets)):
for j, img in enumerate(ex):
# Rotate last image from second data set
if (i == 1) and (j == 2):
img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
h, w = target.shape[:2]
# Get hue channel from HSV color space
target_h = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)[..., 0]
img_h = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)[..., 0]
# Template matching
# cf. https://docs.opencv.org/4.5.2/d4/dc6/tutorial_py_template_matching.html
res = cv2.matchTemplate(img_h, target_h, cv2.TM_CCOEFF_NORMED)
# Get location of maximum
_, max_val, _, top_left = cv2.minMaxLoc(res)
# Set up threshold for decision target found or not
thr = 0.6
if max_val > thr:
# Show found target in example
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img, top_left, bottom_right, (0, 255, 0), 2)
# Visualization
plt.figure(i * 10 + j, figsize=(10, 5))
plt.subplot(1, 2, 1), plt.imshow(img[..., [2, 1, 0]]), plt.title('Example')
plt.subplot(1, 2, 2), plt.imshow(res, vmin=0, vmax=1, cmap='gray')
plt.title('Matching result'), plt.colorbar(), plt.tight_layout()
plt.savefig('{}.png'.format(i * 10 + j))
plt.show()
</code></pre>
<p>新结果:</p>
<p><a href="https://i.stack.imgur.com/orDJ0.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/orDJ0.png" alt="enter image description here"/></a></p>
<p><a href="https://i.stack.imgur.com/9XOWw.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/9XOWw.png" alt="enter image description here"/></a></p>
<p><a href="https://i.stack.imgur.com/67JEu.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/67JEu.png" alt="enter image description here"/></a></p>
<p><a href="https://i.stack.imgur.com/8kRYq.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/8kRYq.png" alt="enter image description here"/></a></p>
<p><a href="https://i.stack.imgur.com/SoEmL.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/SoEmL.png" alt="enter image description here"/></a></p>
<p><a href="https://i.stack.imgur.com/XHjdY.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/XHjdY.png" alt="enter image description here"/></a></p>