<p>我建议通过“调整过滤器”使用模板匹配:</p>
<ul>
<li>将图像转换为二进制图像(正如您所做的),并使用关闭而不是腐蚀</李>
<li>将图像转换为“-1”s和“1”s:将<code>0</code>替换为<code>-1</code>,将<code>255</code>替换为<code>1</code></李>
<li>构建L形内核<code>h</code>(用于查找左下角):
<ul>
<li>将<code>-1</code>放在<code>im</code>中的值需要为<code>-1</code>的地方,将<code>1</code>放在值需要为<code>1</code>的地方</李>
<li>确保<code>h</code>中L形的角位于中心(这有点浪费-您可以避免它,稍后再固定位置)</李>
<li>内核示例(小规模):<br/>
<code>0 -1 1 0 0</code><br/>
<code>0 -1 1 0 0</code><br/>
<code>0 -1 1 1 1</code><br/>
<code>0 -1 -1 -1 -1</code><br/>
<code>0 0 0 0 0</code></li>
</ul></li>
<li>使用内核<code>h</code>筛选<code>im</code>-输出的最大值是最匹配<code>h</code>的位置</李>
<li>查找过滤图像最大值的x、y坐标</李>
</ul>
<p>下面是找到左下角的代码示例:</p>
<pre><code>import numpy as np
import cv2
img = cv2.imread('img1.tif')
orig_img = img.copy()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.bitwise_not(gray)
img = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 25, 11)
img = cv2.morphologyEx(img, cv2.MORPH_OPEN, np.ones((3, 3), np.uint8)) # Opening - remove white dots around corners.
# cv2.imwrite('img.tif', img)
# Convert from 0 to -1 and 255 to 1 (im is "binary" image with "-1"s and "1"s).
im = img.astype(float) / 127.5 - 1
# Build L shape kernel h that matches the L shape we want to search.
# Place "-1" where value in im needs to be "-1", and "1" when value needs to be "1".
# Make sure the corner of the L shape in h is at the center (it's a bit of a waste).
# Example for kernel (small scale):
# 0 -1 1 0 0
# 0 -1 1 0 0
# 0 -1 1 1 1
# 0 -1 -1 -1 -1
# 0 0 0 0 0
h = np.zeros((75, 75)) # Kernel size is 75x75
h[0:37, 37:39] = 1 # Two columns of "1"s from top to center
h[36:38, 37:] = 1 # Two rows of "1"s from center to right side
h[0:39, 36] = -1 # One column of "-1"s
h[38, 36:] = -1 # One row of "-1"s
# Save h kernel as an image for testing
h2 = h.copy()
h2 = ((h2+1)*127.5).astype(np.uint8)
cv2.imwrite('h2.png', h2)
# Filter im with kernel h - the maximum value of the output is the position that best matches h
imf = cv2.filter2D(im, -1, h)
# Find index of maximum value from 2D numpy array
pos_y, pos_x = np.where(imf == np.amax(imf))
# Draw red circle around coordinate (pos_x, pos_y) for testing.
cv2.circle(orig_img, (int(pos_x), int(pos_y)), 8, (0, 0, 255), thickness=2)
cv2.imwrite('circled_im.png', orig_img) # Save image for testing
</code></pre>
<hr/>
<p>结果(左下角):<br/>
<a href="https://i.stack.imgur.com/Kc8Tk.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Kc8Tk.png" alt="bottom left corner"/></a></p>
<p>筛选内核(作为映像):<br/>
<a href="https://i.stack.imgur.com/lS7bq.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/lS7bq.png" alt="Filter kernel (as an image)"/></a></p>
<hr/>
<p><strong>更新:</strong></p>
<p>如果还有其他“L形”对象,您可能需要使用更“激进”的内核</p>
<p>例如:</p>
<pre><code># More "aggressive" kernel
h = np.zeros((75, 75)) # Kernel size is 75x75
h[0:37, 37:41] = 1 # 4 columns of "1"s from top to center
h[34:38, 37:] = 1 # 4 rows of "1"s from center to right side
h[0:39, 36] = -1 # One column of "-1"s
h[38, 36:] = -1 # One row of "-1"s
h[0:34, 41] = -1 # 1 columns of "-1"s from top to center
h[33, 41:] = -1 # 1 rows of "-1"s from center to right side
</code></pre>
<p><a href="https://i.stack.imgur.com/soNS7.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/soNS7.png" alt="enter image description here"/></a></p>