2014-10-28 277 views
4

我有這樣的圖像(閾值,噪聲去除等完成):如何平滑圖像的鋸齒邊緣爲直線?

Original Image

我的最終輸出應是一個圖像,而沒有任何的鋸齒狀邊緣的,並且比給定的圖像變小。我的意思是說,兩幅圖像之間的唯一區別必須是,在新圖像中,鋸齒狀邊緣必須是,而不是填充在中的鋸齒狀邊緣。像這樣(最終圖像必須是紅色邊框內的區域,紅色邊框僅示出解釋):

Image showing how final border should be

我正沿着使用霍夫變換,或使用的線路思維的東西擴張,然後腐蝕,但似乎沒有任何工作(可能是我的錯,因爲我以前沒有在他們的細節過多)。

請注意,我不想這樣做的語言是MATLAB。

有2個主要目標,以這樣的:

  1. 爲了讓邊緣本身,使用霍夫變換
  2. 因此使用regionprops時,像這樣的「極值」屬性返回所需品脫:

enter image description here

的問題,以更簡潔的形式:

  1. 如何在MATLAB中提取這個T,使得它沒有粗糙的邊緣,但是整體圖形不會比原始圖形大,如上面的第二幅圖所示?換句話說,我將使用什麼樣的轉換集合(在MATLAB中)來平滑圖像的邊界,儘可能少地丟失面積(但沒有添加區域),使得粗糙度消失?
  2. 有沒有更高效的方法來提取角(極值)點,如上圖2所示,而不需要經過步驟1?

編輯: 一些更多的樣本圖像:

NB:在考慮所有圖像將大約在90彼此組成矩形的,並沒有其他的數字。因此,例如,用彎曲的邊緣平滑圖像將超出這個問題的答案範圍(甚至對於這個問題,梯形,儘管我認爲平滑2個直邊應該是相同的,而不管是否邊緣還有另外一條平行線)。

這裏有一些更多的圖片,以供參考:

reference image 2 reference image 3, proof of my not-so-great GIMP skills

+2

什麼是你的問題? – Celeo 2014-10-28 17:52:02

+0

對不起。我已經更新了這個問題,以便讓問題更加突出 – 2014-10-28 18:03:59

+1

您可以顯示一些您希望使用此算法的圖像嗎?我認爲編寫一個適用於這個圖像的代碼相對容易,但很難概括它,或者你只關心這個圖像? – 2014-10-28 18:16:26

回答

2

我不知道如果我的回答將滿足您的要求。我把它放在這裏是因爲我覺得評論太長了。

  • 因爲您希望最終輸出小於輸入圖像,侵蝕輸入圖像。你可以選擇合適的內核大小。
  • 對此腐蝕圖像執行拐角檢測。這會給你所有強大的角落,但沒有任何順序
  • 追蹤侵蝕圖像的邊界。這應該給你一個有序的邊界像素列表
  • 現在,在這些有序的邊界點的幫助下,您可以訂購先前找到的邊角
  • 過濾形成大約90度角度的角點。你可以考慮每個3個有序的角點(下圖中的兩個綠點和紅點),這只是爲了說明,而不是我計算出的角點。在這個操作結束時,你所有的紅點都在下面這些圖片是在強烈的角落,除了其他黃色和綠色角點)現在
  • 你可以找到連接2個連續的紅點

  • 線方程

    擬合最小二乘法線到(和包括)每兩個連續的紅色點之間的點

  • ,因爲你做的侵蝕形象,本質上是比原始圖像小的這些處理過程,你應該得到一個更小的形狀

enter image description here