2015年3月18日水曜日

[Python][OpenCV]OpenCVで余白削除 その2

# -*- coding:utf-8 -*-
import cv2

img = cv2.imread('cropped.jpg')
img2 = cv2.imread('cropped.jpg')

# Grayscale に変換
img_gs = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 2 値化
ret, thresh = cv2.threshold(img_gs, 250, 255, cv2.THRESH_BINARY)

# 輪郭を取得
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# i = 1 は画像全体の外枠になるのでカウントに入れない
x1 = []
y1 = []
x2 = []
y2 = []
for i in range(1, len(contours)):
    # ret の中身は (x, y, w, h)
    ret = cv2.boundingRect(contours[i])
    x1.append(ret[0])
    y1.append(ret[1])
    x2.append(ret[0] + ret[2])
    y2.append(ret[1] + ret[3])

x1_min = min(x1)
y1_min = min(y1)
x2_max = max(x2)
y2_max = max(y2)

# 枠取りをした結果を表示
cv2.rectangle(img, (x1_min, y1_min), (x2_max, y2_max), (0, 255, 0), 2)
cv2.imwrite('cropped_edge_rectangle.jpg', img)

# ギリギリで切り出し
crop_img = img2[y1_min:y2_max, x1_min:x2_max]
cv2.imwrite('cropped_edge.jpg', crop_img)

# 少し余白を付けて付けて切り出し
offset = 100
y1_min -= offset
y2_max += offset
x1_min -= offset
x2_max += offset
crop_img = img2[y1_min:y2_max, x1_min:x2_max]
cv2.imwrite('cropped_edge_offset.jpg', crop_img)
元画像

枠取りをした結果

ギリギリで切り出した結果

少し余白を付けて切り出した結果

0 件のコメント:

コメントを投稿