###実現したいこと
以下、
実験系研究者のための画像処理技術(その2)~OpenCVで粒子の形状分布を測定する~
を参考に、
・粒子画像の二値化
・穴埋め処理
・境界検出と描画
・粒子の形状測定
を実行したいと考えています。
<追記>
二値化は実行できており、現在穴埋め処理でつまづいています。
穴埋めで実現したいのはつぎのとおりです。
***粒子の中空(黒)部分の穴埋め***
↓
***その後、境界を検出させて描画***
↓
######実行環境
Windows10
Python3.6.5
openCV4.1.2
###発生している問題
穴埋め処理を行う際に、問題が発生しています。
まず、二値化処理には適応的閾値処理(cv2.adaptiveThreshold)を用いました。
その後、穴埋め処理を実行したいのですが、自身の処理用画像では、参照文献と白黒が逆転している状態のため、穴埋め処理前に白黒の反転作業を行うことにしました。(↓参考URL)
Filling holes in an image using OpenCV ( Python / C++ )
しかし、この反転作業が上手くいかないため、穴埋め処理後の画像では全面にわたって真っ白な状況です。
###該当のソースコード
Python
1import cv2 2import numpy as np 3 4#Step1.画像の読み込み('filename',0(gray scale) or 1(BGR)) 5img = cv2.imread('test_1.tif', 0) 6 #読み込んだ画像は、img_rawの中に[高さ, 幅, (blue, green, red)]のnumpy_arrayとして読み込まれている。 7 8#Step2.二値画像を取得(適応的しきい値処理) 9th = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\ 10 cv2.THRESH_BINARY,11,2) 11 12# Copy the thresholded image. 13im_floodfill = th.copy() 14 15# Mask used to flood filling. 16# Notice the size needs to be 2 pixels than the image. 17h, w = th.shape[:2] 18mask = np.zeros((h+2, w+2), np.uint8) 19 20#Step3. Floodfill処理 21cv2.floodFill(im_floodfill, mask, (0,0), 255) 22 23#Step4. 塗りつぶした画像を反転 24im_floodfill_inv = cv2.bitwise_not(im_floodfill) 25 26#Step5. Combine the two images to get the foreground. 27im_out = th | im_floodfill_inv 28 29#画像の表示 30cv2.imshow('Thresholded Image', th) 31cv2.imshow('Floodfilled Image', im_floodfill) 32cv2.imshow('Inverted Floodfilled Image',im_floodfill_inv) 33cv2.imshow('Foreground', im_out)
###出力結果
Thresholded Image
↓
Floodfilled Image
↓
Inverted Floodfilled Image
↓
Foreground
上図のとおり、途中で確かに白黒反転まではしてくれるのですが、最終的には中心部の黒部分意外にも全体を白く塗りつぶしてしまうようです。
###自分なりの考察
二値化処理と、その後のFloodfill処理で大して変化がないと言う点で、 cv2.floodFill(im_floodfill, mask, (0,0), 255)
内のいずれかの引数に問題があるのでは?
と考えています。
しかし、当方画像処理やopenCVの知識に乏しく、原因を解明できない状況です。次の境界検出・描画へ移行できるよう、なんとか解決したいと思っております。
どなた様かお力添え頂きますと、大変助かります。
###【更新】現在までの試行錯誤結果
ソースコード上では、
画像の読み込み → 二値化 → 穴埋め → 白黒反転
の順番でしたが、これを
画像の読み込み → 二値化 → 白黒反転 → 穴埋め
に変更し、
cv2.floodFill(im_floodfill, mask, (100,30), 255)
と穴埋め対象部分を座標指定すると、穴埋めできました。
あとは、周りのノイジーな白色部分を削除or無視し、真ん中の大きい物体のみに常に(こちらで座標指定せずとも)穴埋めしてくれるとうれしいものです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/19 23:49
2020/01/20 01:51
2020/01/20 02:12