前提・実現したいこと
OpenCVを用いて抽出した輪郭画像をラベリングし,面積が閾値以下の輪郭を全て除きたいです。
ラベリング画像とは別の黒画像に,線画素を写そうと考えています。
発生している問題・エラーメッセージ
描き写す際に大量の余分な線画素が出て,以下のような出力結果になってしまいます。
該当のソースコード
C++
1int main() 2{ 3 Mat gray, labelImg, stats, centroids; 4 int i, j; 5 gray = imread("C:/LoG/edge25.jpg", 0); 6 7 if (gray.empty()) { 8 cout << "error" << endl; 9 return 0; 10 } 11 12 imshow("binary,jpg", gray); 13 waitKey(0); 14 15 //初期値0の画像を生成 16 Mat new_img = Mat::zeros(gray.size(), CV_8UC1); 17 18 //ラベリング処理 19 //gray:元画像 LabelImg:ラベル番号が入った配列データ stats:オブジェクトのバウンディングボックスと面積 20 int nLabel = connectedComponentsWithStats(gray, labelImg, stats, centroids); 21 22 char judge[1000] = {'F'}; 23 24 for (int i = 1; i < nLabel; ++i) { 25 int* param = stats.ptr<int>(i); 26 //cout << "area " << i << " = " << param[ConnectedComponentsTypes::CC_STAT_AREA] << endl; 27 if (param[ConnectedComponentsTypes::CC_STAT_AREA] < 200) { 28 judge[i] = 'F'; 29 } 30 else { 31 judge[i] = 'T'; 32 }; 33 }; 34 35 36 //ラスタ走査 37 for (j = 0; j < labelImg.rows; j++) { 38 for (i = 0; i < labelImg.cols; i++) { 39 if (labelImg.at<int>(j, i) != 0) { 40 if (judge[labelImg.at<int>(j, i)] == 'T') { 41 //面積が閾値以上の時,黒画像に描き写す 42 new_img.at<unsigned char>(j, i) = 255; 43 }; 44 }; 45 }; 46 }; 47 48 imshow("binary,jpg", new_img); 49 waitKey(0); 50}
試したこと
元画像の線画素数が約4500だったのに対して,
judge[labelImg.at<int>(j, i)]の中身を見たところ,
’T’の値が約19000程ありました。(new_imgの線画素数が19000)
補足情報(FW/ツールのバージョンなど)
OpenCV ver-4.5.3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/22 15:53
2021/12/23 00:57