【问题标题】:opencv sharply bounded extracted imageopencv 锐界提取图像
【发布时间】:2019-12-25 02:47:58
【问题描述】:

我能够提取两个图像之间的差异(边缘不清晰的原始图像)。我想要做的是将图像转换为具有锐利四边形边缘的图像(中间步骤到最终图像)。 我正在使用带有 cv2 和 numpy 的 python 2.7。我现在的主要问题是,我不知道如何对其进行编程以生成最终图像(因此如何切割不锐利的边缘并生成具有锐利边缘的最终图像)。

请问,如何进行这种图像处理?

原图

中间步骤

最终图片

其他图片:

【问题讨论】:

  • 在 numpy.zeros 数组上绘制一个白色填充的多边形作为掩码或 roi,并使用它来使图像变黑。见note.nkmk.me/en/python-opencv-numpy-alpha-blend-maskdatacarpentry.org/image-processing/04-drawing-bitwise
  • 这可以工作,但我有很多图像在进行差异检测,这些图像的位置和形状不同(它们有共同的四边形,但这个四边形在不同的图像上可以有不同的边) .通用示例会很棒。
  • 对不起,我不得不把它留给其他人,因为我不精通 OpenCV。如果您知道多边形以便将其绘制在图像上,则可以将其绘制在黑色背景图像上以用作蒙版。如果您不知道多边形,那么您可以阈值,进行形态腐蚀并找到轮廓,然后为其计算一些 N 边多边形。 OpenCV 有一种将多边形拟合到某种形状的方法。见 cv2.approxPolyDP docs.opencv.org/3.1.0/dd/d49/tutorial_py_contour_features.html

标签: python numpy opencv image-processing


【解决方案1】:

首先我们找到平滑的轮廓,然后使用approxPolyDP将其拉直成四边形:

import cv2
import numpy as np

img = cv2.imread(r'c:\TEMP\so57564249.jpg')

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold and shrink mask
_, thresh = cv2.threshold(img_gray, 10, 255, cv2.THRESH_BINARY)
thresh = cv2.erode(thresh, np.ones((10,10), np.uint8), iterations=1)

# find countour
contours,_ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[0]

# straighten contour to quadrilateral
epsilon = 0.001*cv2.arcLength(cnt,True)
while True:
   epsilon += epsilon
   approx = cv2.approxPolyDP(cnt,epsilon,True)
   if len(approx) <= 4:
       break

# output
thresh[:,:] = 0
thresh = cv2.fillPoly(thresh, [approx], 255)
img = cv2.bitwise_and(img, img, mask=thresh)
cv2.polylines(img, [approx], True, (0,255,0), 2)

选择内核大小为 10 来去除图像的模糊边缘或多或少是任意的。您可能需要对其进行调整。为了可视化它的效果,您可以添加

cv2.polylines(img, [cnt], True, (0,0,255))

在最后一行之后绘制初始阈值图像的平滑轮廓。

【讨论】:

  • 谢谢,请问我应该如何将它用于我添加的图像? (请参阅原文中的其他图像)在这些图像中,它无法正常工作。
  • 这是一个完全不同的问题,因为在原始图像中,感兴趣的区域已经被掩盖了。在新图像中,您首先必须提取感兴趣的区域,然后您可以按照上述方法进行操作。提取很困难,因为颜色和值(亮度)都不能单独表征该区域。
  • 我在stackoverflow.com/questions/57580249/… 发布了关于我要实现的目标的单独问题@如果您知道如何做,请检查一下吗?非常感谢百万次!
猜你喜欢
  • 1970-01-01
  • 2011-06-26
  • 2013-11-22
  • 2019-03-13
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
相关资源
最近更新 更多