Python opencv锐利边界提取图像
我能够提取两幅图像之间的差异(原始图像的边缘不锐化)。我试图做的是将图像转换为具有尖锐四边形边的图像(中间步骤到最终图像)。 我将Python2.7与cv2和numpy一起使用。我现在的主要问题是,我不知道如何编程来生成最终图像(所以如何切割未锐化的边缘并生成具有锐化边缘的最终图像) 请问,如何进行图像处理 原始图像 中间步骤 最终图像 其他图像:Python opencv锐利边界提取图像,python,numpy,opencv,image-processing,Python,Numpy,Opencv,Image Processing,我能够提取两幅图像之间的差异(原始图像的边缘不锐化)。我试图做的是将图像转换为具有尖锐四边形边的图像(中间步骤到最终图像)。 我将Python2.7与cv2和numpy一起使用。我现在的主要问题是,我不知道如何编程来生成最终图像(所以如何切割未锐化的边缘并生成具有锐化边缘的最终图像) 请问,如何进行图像处理 原始图像 中间步骤 最终图像 其他图像: 首先,我们找到平滑轮廓,然后使用以下方法将其拉直为四边形: 在最后一条线之后,绘制初始树状图像的平滑轮廓。首先,我们找到平滑轮廓,然后使用以下方法将
首先,我们找到平滑轮廓,然后使用以下方法将其拉直为四边形:
在最后一条线之后,绘制初始树状图像的平滑轮廓。首先,我们找到平滑轮廓,然后使用以下方法将其拉直为四边形:
在最后一行之后,绘制最初树状图像的平滑轮廓。在numpy.zeros数组上绘制一个白色填充多边形作为遮罩或roi,并使用它来遮暗图像。看到了,这可能会起作用,但我有很多图像,我正在进行差异检测,这些图像的位置和形状不同(它们有共同的四方,但这个四方可以在不同的图像上有不同的侧面)。通用示例将非常好。抱歉,我将不得不把它留给其他人,因为我不精通OpenCV。如果知道多边形以便在图像上绘制它,则可以在黑色背景图像上绘制它以用作遮罩。如果您不知道多边形,那么您可以设置阈值,进行形态学腐蚀,找到轮廓,然后为其计算一些N边多边形。OpenCV有一种将多边形拟合到某个形状的方法。请参见cv2.approxPolyDP在numpy.zeros数组上绘制一个白色填充多边形作为遮罩或roi,并使用它来遮暗图像。看到了,这可能会起作用,但我有很多图像,我正在进行差异检测,这些图像的位置和形状不同(它们有共同的四方,但这个四方可以在不同的图像上有不同的侧面)。通用示例将非常好。抱歉,我将不得不把它留给其他人,因为我不精通OpenCV。如果知道多边形以便在图像上绘制它,则可以在黑色背景图像上绘制它以用作遮罩。如果您不知道多边形,那么您可以设置阈值,进行形态学腐蚀,找到轮廓,然后为其计算一些N边多边形。OpenCV有一种将多边形拟合到某个形状的方法。请参见cv2.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)
cv2.polylines(img, [cnt], True, (0,0,255))