下のブロックの画像を右クリックして、「名前を付けて画像を保存」を選び、block1.jpg として保存できます。これを入力画像として使った画像処理です。

以下のプログラムでは、

1.青い領域を抽出
2.ノイズ除去
3.青色領域の輪郭抽出

を行い、各輪郭にたいして、

4.外接矩形(緑)
5.回転ありの外接矩形(赤)
6.外接円(青)
7.重心(白)

を描画しています。

入力画像 block1.jpg

出力画像 out.jpg

プログラム

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
 
H_LOW = 100
H_HIGH = 140
S_LOW = 100
V_LOW = 65
N_ERODE = 2
N_DILATE = 2
 
img = cv2.imread('block1.jpg') # 画像のロード, ディレクトリに画像ファイルを作っておく
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # HSVに変換
mask = cv2.inRange(img_hsv, (H_LOW, S_LOW, V_LOW), (H_HIGH, 255, 255)) # 青領域の抽出, 2値画像
# ノイズ除去
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3)) # カーネル作成 
mask = cv2.erode(mask, kernel, iterations = N_ERODE) # 収縮
mask = cv2.dilate(mask, kernel, iterations = N_DILATE) # 膨張
# 輪郭線の抽出
conts = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]
for cnt in conts: # 各輪郭線についての処理
    # cnt から、色々な特徴が計算ができる
    # 外接矩形
    x, y, w, h = cv2.boundingRect(cnt)
    cv2.rectangle(img, (x,y), (x+w, y+h), (0, 255, 0), 2)
    # 回転ありの外接矩形
    rect = cv2.minAreaRect(cnt)
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    img = cv2.drawContours(img,[box],0,(0,0,255),2)
    # 最小外接円
    (rx,ry),radius = cv2.minEnclosingCircle(cnt)
    center = (int(rx),int(ry))
    radius = int(radius)
    img = cv2.circle(img,center,radius,(255,0,0),2)    
    # 重心
    M=cv2.moments(cnt)
    cx=int(M['m10']/M['m00'])
    cy=int(M['m01']/M['m00'])
    cv2.circle(img, (cx,cy), 3, (255,255,255), -1)
 
# ファイルに出力
cv2.imwrite('out.jpg', img)