import numpy as np
import cv2
img = cv2.imread('input.png') # Read input image (BGR color format)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Convert to grayscale
thresh = cv2.threshold(gray, 1, 255, cv2.THRESH_BINARY)[1] # Convert to binary (only zeros and 255)
horz = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, np.ones((3, 15))) # Keep only horizontal lines
vert = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, np.ones((15, 3))) # Keep only vertical lines
mask = cv2.bitwise_or(horz, vert) # Unite horizontal and vertical lines to form a mask
res = cv2.bitwise_and(img, img, mask=mask) # Place zeros where mask is zero
# Show the result
cv2.imshow('mask', mask)
cv2.imshow('res', res)
cv2.waitKey()
cv2.destroyAllWindows()
我想到了与Cris评论相同的解决方案:
np.ones((3, 15))
内核应用形态学打开-仅保持水平线李>np.ones((15, 3))
内核应用形态学打开-仅保持垂直线李>下面是一个代码示例:
结果:
mask
:res
:结果不是完美的,也不是一般化的。
使用for循环可以获得更好的结果。
示例:删除下面有许多水平像素,但旁边只有少数水平像素的像素(对左、右和底部重复)
相关问题 更多 >
编程相关推荐