OpenCV 関数dilate()
を、実際には大きな画像内の ROI であるオブジェクトerode()
に適用する必要があります。 元の画像内に ROI のヘッダーを作成することによって生成されます。Mat
Mat roiImg
img
Mat img = imread(...);
Mat roiImg = img (Rect(...));
これは の引数のリストですerode()
:
void erode(InputArray src, OutputArray dst, InputArray kernel, Pointanchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )
問題は、関数 erode/dilate への入力画像が ROI のヘッダーであるためBORDER_CONSTANT
、境界値と等しい境界線タイプとして選択しmorphologyDefaultBorderValue()
ても影響がなく、境界値が元から取得されるように見えることです。画像。
次に、のドキュメントでこれを見つけましたcopyMakeBorder()
:
ソース画像がより大きな画像の一部 (ROI) である場合、関数は ROI の外側のピクセルを使用して境界線を形成しようとします。この機能を無効にして
src
、ROI ではないかのように常に外挿を行うには、borderType | を使用します。BORDER_ISOLATED
.
ただし、cv::borderInterpolate()
関数内から呼び出される関数は、有効な境界線の種類としてerode()
受け入れられません!BORDER_ISOLATED
今のところ、この問題を回避するには、 を複製roiImg
してから を呼び出す必要がありますerode()
。しかし、理想的には、クローン作成のオーバーヘッドは必要ありません。これを回避する方法はありますか?