【发布时间】:2021-07-06 13:06:45
【问题描述】:
我有一张类似于下图(左侧)的图片:
我只想提取右侧的红色像素:属于 1px 垂直线的像素,但 不 到任何较粗的线或具有超过 1 个相邻黑色像素的其他区域。图片是黑白的。
到目前为止,我已经尝试了一个带有垂直(10px,这是我的目的)和水平内核的形态 OPEN 并采取了差异,但这需要一个尴尬的转变并留下一些“斑点”:
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 10))
vertical_mask1 = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel,
iterations=1)
horz_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 1))
horz_mask = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horz_kernel,
iterations=1)
M = np.float32([[1,0,-1],[0,1,1]])
rows, cols = horz_mask.shape
vertical_mask = cv2.warpAffine(horz_mask, M, (cols, rows))
result = cv2.bitwise_and(thresh, cv2.bitwise_not(horz_mask))
隔离 1px 线(并且只有 1px 线)的正确方法是什么?
在一般情况下,对于其他内核,这个问题是:如何找到图像中位于内核“适合其内部”的区域中的所有像素(然后进行减法以获得我想要的结果)?
【问题讨论】:
-
在您的示例图片中,您只有一条像素红线。对于这张图片,您可以逐个像素地进行暴力破解,并且 (1) 将与多个黑色像素相邻的所有红色像素更改为白色,然后 (2) 将所有黑色像素更改为白色。对于更复杂的图片,您必须添加删除所有宽线的第三步。
-
@bfris 红色像素是所需的输出。
标签: opencv mathematical-morphology straight-line-detection