質問: python2.7,openCV4.0.0を使っています. 添付してある画像は見てもらうとわかりますが白とグレーからなる地図の画像です. この画像に対し.色と色との間に黒で輪郭をつけそれを元にopenCVで輪郭取得を したいとおもっております. この輪郭取得は分かるのですが画像にpythonを用いて輪郭をつける方法がわかりません.
回答: > > 色と色との間に黒で輪郭をつけそれを元にopenCVで輪郭取得を > > したいとおもっております. > > > 「輪郭をつける」の意味がよくわかりませんが、輪郭を画像から抽出したいということでしょうか? 輪郭抽出 ``` import cv2 import numpy as np # 画像を読み込む。 img = cv2.imread('test.png', cv2.IMREAD_GRAYSCALE) # 2値化 thresh, binary = cv2.threshold( img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # closing でノイズを消す kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel, iterations=2) # 輪郭抽出する。(OpenCV 3) _, contours, hierarchy = cv2.findContours( binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) # OpenCV4 の場合 #contours, hierarchy = cv2.findContours( # binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) ``` 結果描画 ``` import matplotlib.pyplot as plt from matplotlib.patches import Polygon def draw_contours(ax, img, contours): ax.imshow(img, cmap='gray') ax.axis('off') for i, cnt in enumerate(contours): cnt = np.squeeze(cnt, axis=1) # (NumPoints, 1, 2) -> (NumPoints, 2) # 輪郭の点同士を結ぶ線を描画する。 ax.add_patch(Polygon(cnt, color='b', fill=None, lw=2)) # 輪郭の点を描画する。 ax.plot(cnt:, 0], cnt[:, 1], 'ro', mew=0, ms=4) # 輪郭の番号を描画する。 ax.text(cnt[0][0], cnt[0][1], i, color='orange', size='20') fig, ax = plt.subplots(figsize=(6, 6)) draw_contours(ax, img, contours) plt.show() ``` 抽出した輪郭を可視化 ![イメージ説明