OpenCVを使い、画像から白色の楕円型オブジェクトを切り抜くプログラムを考えています。
楕円オブジェクトの検出はほかのプログラムで行い、ここでは楕円オブジェクトの輪郭の切り抜きだけを行います。
HSVで画像を読み込んだ後、処理を重ねて大まかな輪郭を取得することはできましたが、光の反射等の映り込みにより、きれいな形を切り抜くことができません。
写真1枚目が加工なしの輪郭。
2枚目がapproxPolyDPをかけたあとの輪郭。
3枚目の赤い部分が不要な箇所です。
写真からわかるように本体から突出した部分だけ削除する方法を考えています。
何かアドバイスを頂けないでしょうか。
よろしくお願いいたします。
Python
1import cv2 2import numpy as np 3 4img= cv2.imread("image.jpg") 5img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) 6 7#検出範囲(HSV) 8white_min = (22,0,178) 9white_max = (210,51,255) 10 11img = cv2.inRange(img, white_min, white_max) 12 13#HSV範囲内で最大の輪郭を取得 14contours = cv2.findContours( 15 img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0] 16 17max_cnt = max(contours, key=lambda x: cv2.contourArea(x)) 18 19#表面の凹凸を減らす 20max_cnt = cv2.approxPolyDP(max_cnt, epsilon=0.001 *cv2.arcLength(max_cnt, True), closed=True) 21 22out = np.zeros_like(img) 23cv2.drawContours(out,[max_cnt], -1, color=255, thickness=-1)
自身がないのでこちらで。
方法1.巨大なカーネルを使ってOpening処理
http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html#opening
方法2.巨大なガウシアンカーネルを使ってぼかし、閾値処理で白い場所をくくりだす
http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_filtering/py_filtering.html#id5
ぼけきっていない値の高い場所(たとえば200以上)などを選定すればそれっぽく括りだせるかも?
> 方法2.巨大なガウシアンカーネルを使ってぼかし、閾値処理で白い場所をくくりだす
私の過去の質問↓でやってるような感じですかね.
https://teratail.com/questions/204418
お返事ありがとうございます。
opening処理を行ったところ、かなり角が取れて理想に近い形になりました。
必要な部分も削れてしまいましたが、あとは値の調整で上手く仕上げようと思います。
ありがとうございました。
> opening処理を行ったところ、かなり角が取れて理想に近い形になりました。
解決したのなら、「解決済」にしてください









