2020年5月28日木曜日

【OpenCV】円を描画するcircle

 画像処理ライブラリOpenCVで円を描画するcircleについて説明する。


OpenCVを使うには次のようにインポートが必要。
import cv2


1. 円を描画するcircle

 円を描画するcircleの書式は以下の通り。

cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])

引数 意味
img 円を描画する画像
center 円の中心座標。(x, y)のタプルで指定
radius 円の半径
color 円の色。(b, g, r)で指定。
thickness(省略可) 円の枠線の幅。-1の場合は塗りつぶしになる。
デフォルトは1
lineType(省略可) cv2.FILLED
cv2.LINE_8(8連結、デフォルト)
cv2.LINE_4(4連結)
cv2.LINE_AA(アンチエイリアス処理)
shift(省略可) 座標および半径を小数表示する場合に使用。指定した場合
(x, y), r が
(x/2^shift, y/2^shift), r/2^shift となる。
デフォルトは0

幅400高さ300の白画像を作成し、x=250,y=100の位置に半径90の赤い塗りつぶした円を描画する例。

import cv2
import numpy as np

img = np.zeros((300, 400, 3), np.uint8)
img[:, :, :] = 255

cv2.circle(img, (250, 100), 90, (0,0,255), -1)

cv2.imwrite('circle.png', img)

実行結果



2. 引数lineTypeを指定した場合

 lineTypeを指定すると円の境界線の種類を選択できる。
cv2.FILLED
cv2.LINE_8(8連結、デフォルト)
cv2.LINE_4(4連結)
cv2.LINE_AA(アンチエイリアス処理)
以下のような違いがある。

import cv2
import numpy as np

img = np.zeros((100, 100, 3), np.uint8)
img[:, :, :] = 255

cv2.circle(img, (100, 50), 90, (0,0,255), lineType=cv2.FILLED)
cv2.circle(img, (120, 50), 90, (0,0,255), lineType=cv2.LINE_4)
cv2.circle(img, (140, 50), 90, (0,0,255), lineType=cv2.LINE_8)
cv2.circle(img, (160, 50), 90, (0,0,255), lineType=cv2.LINE_AA)

cv2.imwrite('lineType.png', img)

 左からcv2.FILLEDcv2.LINE_4cv2.LINE_8cv2.LINE_AA
cv2.LINE_AAは中間色を使ったアンチエイリアス処理が施されギザギザが低減される。

実行結果



3. 引数shiftを指定した場合

 shiftを指定すると円の中心座標(center)および半径(radius)が2^shiftで割られた値となる。つまりshift=1の場合1/2、shift=2の場合1/4、shift=3の場合1/8・・・となる。
中心座標、半径には整数しか与えられないが、shiftにより小数に変換できる。

import cv2
import numpy as np

img = np.zeros((300, 400, 3), np.uint8)
img[:, :, :] = 255

cv2.circle(img, (250, 100), 90, (0,0,255), -1)
cv2.circle(img, (250, 100), 90, (0,0,255), -1, shift = 1 )
cv2.circle(img, (250, 100), 90, (0,0,255), -1, shift = 2 )
cv2.circle(img, (250, 100), 90, (0,0,255), -1, shift = 3 )

cv2.imwrite('shift.png', img)

左からshift=3、shift=2、shift=1、shiftなし。

実行結果



4. リファレンス

OpenCV > Drawing Functions > circle()

使用したバージョン:Python 3.7.0 / OpenCV 4.0.0

0 件のコメント:

コメントを投稿