形状特徴II(アスペクト比、ソリディティ、等価直径など)

V3.0.0

In [32]:
# -*- coding: utf-8 -*-
import cv2
import numpy as np
#Ipythonで表示用の設定
import matplotlib.pyplot as plt
%matplotlib inline

#画像読込
in_img1 = cv2.imread("pic1.png") #処理用
in_img2 = cv2.imread("pic1.png") #表示用

#グレイ画像へ変換
gray_img   = cv2.cvtColor(in_img1, cv2.COLOR_BGR2GRAY)
#2値化
ret,thresh = cv2.threshold(gray_img,220,1,0)
#輪郭抽出
image, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

#ID:5の輪郭をオーバレイ
cv2.drawContours(in_img2, contours, 5, (0,255,0), 3)

#ID:5のオブジェクトのモーメント算出
cnt = contours[5]

x,y,w,h = cv2.boundingRect(cnt)
print "ASPECT RATIO:", float(w)/h,"\n"

hull = cv2.convexHull(cnt)
hull_area = cv2.contourArea(hull)
print "SOLIDITY:",float(area)/hull_area,"\n"

print "Equivalent Diameter:", np.sqrt(4*area/np.pi),"\n"

area = cv2.contourArea(cnt)
rect_area = w*h
print "EXTENT:",float(area)/rect_area,"\n"

(x,y),(MA,ma),angle = cv2.fitEllipse(cnt)
print "Major Axis and Minor Axis lengths:", ma, MA,"\n"
print "ANGLE", angle,"\n"

mask = np.zeros(in_img1.shape,np.uint8)
cv2.drawContours(mask,[cnt],0,255,-1)
print "Pixel Points:\n", np.transpose(np.nonzero(mask))

#OpenCVがBGRなのでRGBに変換
disp_out_img = cv2.cvtColor(in_img2, cv2.COLOR_BGR2RGB)
#画像表示
plt.figure(figsize=(6,6))
plt.imshow(disp_out_img)
ASPECT RATIO: 0.738095238095 

SOLIDITY: 0.950673608502 

Equivalent Diameter: 106.187614194 

EXTENT: 0.755760368664 

Major Axis and Minor Axis lengths: 135.2525177 87.7450714111 

ANGLE 174.870758057 

Pixel Points:
[[159  37   0]
 [159  38   0]
 [159  39   0]
 ..., 
 [284  63   0]
 [284  64   0]
 [284  65   0]]

Out[32]:
<matplotlib.image.AxesImage at 0xce25870>
inserted by FC2 system