2016-12-24 15 views
2

私は以下のようなイメージを持っています。画像の寸法は固定されています:640x480イメージからすべての領域を抽出するにはどうすればよいですか?

enter image description here

私は右上を知っておく必要があり、これらのそれぞれの左下のポイント:私はこのような長方形ですべての非ゼロの領域をバインドしたい

enter image description here

長方形。

私はループと他の方法について考えました。しかし、それらのすべてが実行するには時間がかかります。これをPythonで行う最も効率的な方法は何ですか?

PS:私は画像処理の初心者です。これは明白な質問かもしれない、私は知らない。だから私にサンプルコードを与えることは多くの助けになるだろう。ありがとう。

答えて

1

イメージ内のすべてのサブコンポーネントを見つけることは、connected component analysisと呼ばれます。 OpenCVでは、ライブラリのfindCountour()機能で実行できます。

import cv2 
import numpy as np 
from scipy import signal 

#========================================================================= 
# Locate all components 
#========================================================================= 
def locateComponents(img): 
    """Extracts all components from an image""" 

    out = img.copy()  
    res = cv2.findContours(np.uint8(out.copy()),\ 
       cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  
    contours = res[1] 

    ret = [] 
    row, col = out.shape 
    minSiz = 8 

    for cnt in contours: 
     # get bounding box 
     y, x, n, m = cv2.boundingRect(cnt) 
     # check area 
     if m < minSiz or n < minSiz: 
      continue 
     #end if  

     ret.append(np.int32([x, x+m, y, y+n])) 
     out = cv2.rectangle(out, (y,x), (y+n,x+m), (255,255,255), 2) 

    #end for 

    return ret, out 

# end function 

#========================================================================= 
# TESTING 
#========================================================================= 

img = cv2.imread('input.jpg', 0) 

regions, out = locateComponents(img) 
cv2.imwrite('output.jpg', out) 
print regions 

cv2.imshow('Given image', img) 
cv2.imshow('Located regions', out) 
cv2.waitKey(0) 

出力画像:

The output image

ここ

サンプルコードであります

関連する問題