<p>下面是使用Python/OpenCV实现这一点的一种方法</p>
<pre><code> - Read the input
- Convert to HSV and extract only the saturation channel (black/white/gray have zero saturation)
- Threshold
- Apply morphology open and close to remove the extranous white regions
- Get the contour and approximate to simple polygon
- Draw the polygon on the input
- Save the results
</code></pre>
<p><br/>
输入:</p>
<p><a href="https://i.stack.imgur.com/7HrgG.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/7HrgG.png" alt="enter image description here"/></a></p>
<pre><code>import cv2
import numpy as np
# read image
img = cv2.imread('board.png')
# convert to HSV and extract saturation channel
sat = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)[:,:,1]
# threshold
thresh = cv2.threshold(sat, 90, 255, 0)[1]
# apply morphology close to fill interior regions in mask
kernel = np.ones((7,7), np.uint8)
morph = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
kernel = np.ones((13,13), np.uint8)
morph = cv2.morphologyEx(morph, cv2.MORPH_CLOSE, kernel)
# get contours (presumably only 1) and fit to simple polygon (quadrilateral)
cntrs = cv2.findContours(morph, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cntrs = cntrs[0] if len(cntrs) == 2 else cntrs[1]
c = cntrs[0]
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.05 * peri, True)
# draw polygon on input
result = img.copy()
cv2.polylines(result, [np.int32(approx)], True, (0,0,255), 1, cv2.LINE_AA)
# write result to disk
cv2.imwrite("board_saturation.png", sat)
cv2.imwrite("board_thresh.png", thresh)
cv2.imwrite("board_morph.png", morph)
cv2.imwrite("board_contour.png", result)
# display it
cv2.imshow("IMAGE", img)
cv2.imshow("SAT", sat)
cv2.imshow("THRESH", thresh)
cv2.imshow("MORPH", morph)
cv2.imshow("RESULT", result)
cv2.waitKey(0)
</code></pre>
<p><br/>
饱和通道图像:</p>
<p><a href="https://i.stack.imgur.com/37KNP.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/37KNP.png" alt="enter image description here"/></a></p>
<p>阈值图像:</p>
<p><a href="https://i.stack.imgur.com/SlpPm.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/SlpPm.png" alt="enter image description here"/></a></p>
<p>形态学清理图像:</p>
<p><a href="https://i.stack.imgur.com/xnhnu.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/xnhnu.png" alt="enter image description here"/></a></p>
<p>输入时的轮廓:</p>
<p><a href="https://i.stack.imgur.com/qIvLp.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/qIvLp.png" alt="enter image description here"/></a></p>