実現したいこと
困っています
一番中心に近い輪郭を切り取るプログラムを作りたいと思っています。
発生している問題・エラーメッセージ
特になし
該当のソースコード
Python
1import cv2 2import os 3import matplotlib.pyplot as plt 4from matplotlib.patches import Polygon 5from matplotlib.patches import Rectangle 6import numpy as np 7from PIL import Image 8from PIL import ImageDraw 9from PIL import ImageFont 10 11 12 13img = cv2.imread("img234.jpg")#images12.jpg") 14 15# グレースケールに変換する。 16grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 17 18""" 19ret, binaryImg = cv2.threshold(grayImg,90,255,cv2.THRESH_BINARY) 20 #print(binaryImg) 21 22neiborhood8 = np.array([[1, 1, 1],[1, 1, 1],[1, 1, 1]],np.uint8) 23erodeImg = cv2.erode(binaryImg,neiborhood8,iterations =10) 24dilateImg = cv2.dilate(erodeImg,neiborhood8,iterations = 10) 25""" 26#2値化 27#ret,thresh = cv2.threshold(grayImg,60,255,0) 28 29#反転 30#thresh= cv2.bitwise_not(thresh) 31 32retval, im_bw = cv2.threshold(grayImg, 120, 255, cv2.THRESH_BINARY_INV )#+ cv2.THRESH_OTSU) 33 34# 輪郭の検出 35contours, hierarchy = cv2.findContours(im_bw, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 36 37 38def draw_contours(ax, img, contours): 39# 抽出した輪郭を描画する。 40 ax.imshow(img, cmap='gray') 41 ax.axis('off') 42 for i, cnt in enumerate(contours): 43 cnt = np.squeeze(cnt, axis=1) # (NumPoints, 1, 2) -> (NumPoints, 2) 44 # 輪郭の点同士を結ぶ線を描画する。 45 ax.add_patch(Polygon(cnt, color='b', fill=None, lw=2)) 46 # 輪郭の点を描画する。 47 #ax.plot(cnt[:, 0], cnt[:, 1], 'ro', mew=0, ms=3) 48 # 輪郭の番号を描画する。 49 #ax.text(cnt[0][0], cnt[0][1], i, color='orange', size='20') 50fig,ax = plt.subplots(figsize=(6, 6)) 51ax.set_title("cv2.RETR_CCOMP") 52 #print(con,tours) 53 #print(cnt) 54draw_contours(ax, img, contours) 55 56# 元画像の幅と高さを取得 57srcHeight, srcWidth, srcColor = img.shape 58print("width: %d, height: %d" % (srcHeight, srcWidth)) 59# 面積を取得 60srcArea = srcWidth * srcHeight 61print("area: %d" % srcArea) 62# 全面積の0.1倍(10%)以上の輪郭だけ保存する 63thresholdArea = srcArea * 0.05 64 65number = 1 66maxArea = 0 67maxImage = None 68for cnt in contours: 69 # 輪郭に外接する長方形を取得する。 70 x, y, width, height = cv2.boundingRect(cnt) 71 # 長方形を描画する。 72 ax.add_patch( 73 Rectangle(xy=(x, y), width=width, height=height, color="g", fill=None, lw=2) 74 ) 75 print(" sub-area: %d" % (width * height)) 76 if (width * height >= thresholdArea): 77 img0 = img[y:(y+height), x:(x+width)] 78 cv2.imwrite("output_%d.jpg" % number, img0) 79 number += 1 80 if (width * height > maxArea): 81 maxArea = width * height 82 maxImage = img0 83 84cv2.imwrite("max.jpg", maxImage) 85 86#size = tuple([img.shape[0], img.shape[1]]) 87#print(size) 88#img1 = img[y:(y+height), x:(x+width)] 89 90#cv2.imwrite("out_sample126.jpg", img) 91#cv2.imshow('thresh', im_bw) 92#cv2.waitKey(0) 93#cv2.destroyAllWindows() 94plt.imshow(img) 95plt.show()
試したこと
一番面積が大きい輪郭を保存した
補足情報(FW/ツールのバージョンなど)
OpenCV 3.4.0
回答1件
あなたの回答
tips
プレビュー