ここから本文です

質問お願いします。 現在opencv3.0c++を用いてラベリング処理を行っています。そ...

chk********さん

2018/11/2617:17:47

質問お願いします。
現在opencv3.0c++を用いてラベリング処理を行っています。そこで問題なのですが、小さい面積を除去することができないのですが、どうすればよいのでしょうか。
具体的には

、opencv3.0のラベリング関数を用いて、ピクセル数で除去しようと考えてるのですが、参照のしかたがわかりません。
どうかお願いします。#include <iostream>
#include <cmath>
#include <string>
#include <sstream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <ctype.h>
using namespace cv;
using namespace std;

int main(void)
{
//グレースケール入力
cv::Mat src = cv::imread("二値化true.bmp", cv::IMREAD_GRAYSCALE);
//ラべリング処理
cv::Mat LabelImg;
cv::Mat stats;
cv::Mat centroids;
int nLab = cv::connectedComponentsWithStats(src, LabelImg, stats, centroids);


// ラベリング結果の描画色を決定
std::vector<cv::Vec3b> colors(nLab);
colors[0] = cv::Vec3b(0, 0, 0);
for (int i = 1; i < nLab; ++i) {
colors[i] = cv::Vec3b((rand() & 255), (rand() & 255), (rand() & 255));
}
// ラベリング結果の描画
cv::Mat Dst(src.size(), CV_8UC3);
for (int i = 0; i < Dst.rows; ++i) {
int *lb = LabelImg.ptr<int>(i);
cv::Vec3b *pix = Dst.ptr<cv::Vec3b>(i);
for (int j = 0; j < Dst.cols; ++j) {
pix[j] = colors[lb[j]];
}


cv::imshow("Src", src);
cv::imshow("Labels", Dst);
cv::waitKey();
return 0;
}

閲覧数:
23
回答数:
1
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

ten********さん

2018/11/2818:46:32

「小さい面積」というのが数ピクセル程度なら、ラベリング前にモフォロジー処理して、除去するのが一般的ですかね

https://www.cellstat.net/count/

あたりが参考になるかな

質問した人からのコメント

2018/12/3 09:42:22

ありがとうございます!
参考にさせて頂きます。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる