2017-02-25 6 views
0

私はこのような辞書の定義を持つ画像を扱っています: This is what I have 画像の上部またはボットの境界線に触れると、隣接する項目(上部およびボット)からこれらの小さな要素を取り除きたい This is what I want与えられたスコープと一致する配列の配列で値のペアをトリミングする方法は?

私はそれを実行しようとした方法であった:この画像は(赤)を示すように、(上部またはボットに触れる任意の実際の文字を含まない)、それからのさらなる20より画素を拡張 1ロード画像グレースケールで 2.画像の輪郭を取得するにはcv2.findContours 3. x = 0から始まりx = 20より後に終了する輪郭を見つける 4. F高さ1で始まり高さ21で終わる等高線ind 5.これらの等高線を白で塗りつぶします。

問題はcv2.findContoursは座標のペアの配列の配列のリストを返します。特定の座標ペアを削除することができましたが、ここではそれを適用するのが難しいです。

私は多数のアプローチを試してみましたが、現在、私はこれで立ち往生しています:私はここにfindContoursを使用する必要はないと思う

import cv2 
import os 
def def_trimmer(img): 
    height, width = img.shape 
    img_rev = cv2.bitwise_not(img) 
    _, contours, _ = cv2.findContours(img_rev,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) 
    # contours = np.concatenate(contours, axis = 0) 
    # contours = contours[((contours<[20-1, width])|(contours>[height-20-1, -1])).all(axis=(1,2))] 
    for outer in contours: 
     # for outer2 in outer1: 
     oldlen = len(outer) 
     outer = outer[(((outer<[20-1, width])|(outer>[height-20-1, -1])).all(axis=(1, 2)))] 
     newlen = len(outer) 
     print((oldlen, newlen)) 
    cv2.drawContours(img,contours,-1,(255,255,255),-1) 
    return(img) 
img = cv2.imread("img.png") 
img_out = def_trimmer(img) 
cv2.imshow("out", img_out) 

答えて

1

あなたのケースでは、画像の境界にあるピクセルを繰り返し処理し、成長領域アルゴリズムを使用して境界に接触するコンポーネントを削除するだけです。より詳細に:

  • 黒い部分が見つかるまで繰り返します。
  • ピクセル座標を格納するリストを初期化します。
  • 隣接する黒いピクセルの再帰を使用してそれらを削除し、座標をリストに格納します。再帰がイメージの境界から20ピクセル以上離れている場合は、リスト内に保存されている座標を使用する前に、ピクセルの削除をやめ、消去したものを復元します。
  • 他の境界要素が残らなくなるまで、最初から繰り返します。
+0

提案していただきありがとうございます。それは確かに速くて簡単かもしれません。私はすぐにそれを試してみましょう:) – MrVocabulary

関連する問題