【问题标题】:OpenCV - How to split a image to two regions by a oblique line?OpenCV - 如何通过斜线将图像分成两个区域?
【发布时间】:2017-10-11 02:02:43
【问题描述】:

我正在使用HoughLinesP 来检测图像中的线条。结果是一条斜线。我想对线下的区域做一些操作(腐蚀和扩张)。

所以我想问一下如何通过这条线将图像分割成两个区域(区域0和区域1)或处理区域1而不分割图像。

例如图片大小为200*100,行为(0, 50, 200, 75)

如果线条是水平或垂直的,我可以在获得裁剪区域的 rect(x, y, w, h) 时使用image[y:y+h, x:x+w] 裁剪图像。但我不知道斜线。

【问题讨论】:

  • 预期输出是什么?根据定义,图像必须是矩形的。
  • 其实我只是在region1做一些操作,而不是在region0。所以我想分割图像。如果有一些方法可以只处理 region1 而没有分割图像,那没关系。
  • 我们可以定义两个掩码来定义两个区域。这样,无论您对每个区域执行什么操作,都不会处理归零的区域。但是,我感觉这是一个 XY 问题。您能否描述一下您打算在这些地区开展哪些业务?
  • 侵蚀和扩张。
  • 好的,那么定义两个掩码可以接受吗?

标签: python opencv numpy image-processing


【解决方案1】:

您可以像这样使用slice-op 获取rectangle,使用mask-op 获取non-rectangle

基本步骤是:

  1. 定义一个空图像。
  2. 定义角点。
  3. 空图像中的drawContours(填充)
  4. 做掩码操作

我的 Python3-OpenCV3.3 代码:

## Step 1-3: drawContours in empty image
mask = np.zeros((100,200), np.uint8)
pts = np.array([[0,0],[0,50],[199,75],[199,0]])
_=cv2.drawContours(mask, np.int32([pts]),0, 255, -1)

## Step 4: do mask-op
img1 = img.copy()
img2 = img.copy()
img1[mask==0] = 0
img2[mask>0] = 0

## Write
cv2.imwrite("mask.png", mask)
cv2.imwrite("img1.png", img1)
cv2.imwrite("img2.png", img2)

这是图片和结果:

源代码和掩码:

结果:

【讨论】:

  • 使用result[mask==0] = img2[mask==0]result[mask>0] = img1[mask>0]合并,对吧?
  • 对,你可以试试
  • 不知道是不是我们只有两个点,在绘制轮廓的时候不知道要包括哪两个角点,那么这种情况下如何获取mask呢?谢谢
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 2021-06-26
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多