2017-08-25 33 views
0

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

例如,

讓我的輸入圖像是這樣的。

enter image description here

你可以看到在邊界受到一些干擾。一些像素只是從邊界投影。邊界不是完美的直線。

所需的輸出是這樣的事情。

enter image description here

+0

應該如何算法猜你想達到什麼?你能否做出任何假設,如從任何黑色像素到最近的白色像素的距離可能不會大於x(字母線的寬度)?或者你有一套目標模板? – Micka

回答

1

你可以做OCR,然後打印與所需的字體的結果。沒有其他方式將您的輸入圖像轉換爲理想的所需形狀。

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 - [來自評論](/ review/low-quality-posts/17217175) – meowgoesthedog

+0

問題是:「是否有任何工具可以使界限在圖像中得到很好的定義。」答案是OCR工具,因爲要重建「完美」的對象輪廓,您需要關於可以滿足的對象的信息。如果我們使用字母,關於「完美」形狀的信息以字母形狀存儲。如果你做OCR,你可以打印完美的形狀。 –

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