如何明确定义对象的边界?

时间:2017-08-25 05:50:31

标签: opencv image-processing ocr image-preprocessing

是否有任何工具可以在图像中明确定义边界。 我正在使用Python-OpenCV。它是否有任何此功能的方法?

例如。

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

enter image description here

你可以看到边界上的一些干扰。有些像素只是从边界投射出来的。边界不是完美的直线。

期望的输出是这样的。

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:1)

您可以执行OCR,然后使用所需的字体打印结果。没有其他方法可以将输入图像转换为理想的所需形状。