如何使对象的边界定义良好?

问题描述:

是否有任何工具可以使边界在图像中被很好地定义。 我正在使用Python-OpenCV。它是否有任何此功能的方法?如何使对象的边界定义良好?

例如,

让我的输入图像是这样的。

enter image description here

你可以看到在边界受到一些干扰。一些像素只是从边界投影。边界不是完美的直线。

所需的输出是这样的事情。

enter image description here

+0

应该如何算法猜你想达到什么?你能否做出任何假设,如从任何黑色像素到最近的白色像素的距离可能不会大于x(字母线的宽度)?或者你有一套目标模板? – Micka

你可以做OCR,然后打印与所需的字体的结果。没有其他方式将您的输入图像转换为理想的所需形状。

+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/17217175) – meowgoesthedog

+0

问题是:“是否有任何工具可以使界限在图像中得到很好的定义。”答案是OCR工具,因为要重建“完美”的对象轮廓,您需要关于可以满足的对象的信息。如果我们使用字母,关于“完美”形状的信息以字母形状存储。如果你做OCR,你可以打印完美的形状。 –

您可以使用cv2.findContours()检测图像中的轮廓,然后用线逼近轮廓。请参阅OpenCV contours tutorial上的轮廓逼近部分。在教程中注意,在盒子内部拍摄的部分可能有点锯齿状,但轮廓逼近只是画出了很好的直线。你可以用同样的方式来思考K,整体轮廓就像一个盒子,但是里面有碎片。

这似乎很好地工作:

import cv2 
import numpy as np 

img = cv2.imread('k.png', 0) # read as grayscale 
img = 255 - img # flip black and white 

# find contours in the image 
bin_img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1] 
mode = cv2.RETR_EXTERNAL 
method = cv2.CHAIN_APPROX_SIMPLE 
contours = cv2.findContours(bin_img, mode, method)[1] 

# take largest contour, approximate it 
contour = contours[0] 
epsilon = 0.005 * cv2.arcLength(contour, True) 
approx_contour = cv2.approxPolyDP(contour, epsilon, True) 

contour_img = np.zeros_like(img) 
contour_img = cv2.fillPoly(contour_img, [approx_contour], 255) 
contour_img = 255 - contour_img # flip back black and white 

cv2.imshow('Fixed k', contour_img) 
cv2.waitKey() 

输入: Input K

输出: Approximated contours of K