BETA

水平、垂直な線を取り除く

投稿日:2020-06-09
最終更新:2020-06-25
var src = new Mat(@".\data.png", ImreadModes.Grayscale);  

float[,] filterX = { { 0,  0, 0 },  
                     { 0, -1, 1 },  
                     { 0,  0, 0 },  
};  

float[,] filterY =  { { 0,  0, 0 },  
                      { 0, -1, 0 },  
                      { 0,  1, 0 },  
};  

var filter2D = new Mat();  

Cv2.Filter2D(src, filter2D, MatType.CV_32FC1, InputArray.Create(filterX));  
Cv2.Filter2D(filter2D, filter2D, MatType.CV_32FC1, InputArray.Create(filterY));  

filter2D = Cv2.Abs(filter2D);  

Cv2.Normalize(filter2D, filter2D, 0, 255, NormTypes.MinMax, MatType.CV_8UC1);  

Cv2.Threshold(filter2D, filter2D, 1, 255, ThresholdTypes.Binary);  

Cv2.ImShow("filter2D", filter2D);  
Cv2.WaitKey();  

byte[,] element1 = { { 0, 0, 1 },  
                     { 0, 1, 0 },  
                     { 1, 0, 0 },  
};  

Cv2.MorphologyEx(filter2D, filter2D, MorphTypes.Close, InputArray.Create(element1));  

byte[,] element2 = { { 1, 0 },  
                     { 0, 1 },  
};  

Cv2.MorphologyEx(filter2D, filter2D, MorphTypes.Close, InputArray.Create(element2));  

var label = new Mat();  
var stats = new Mat();  
var centroids = new Mat();  
var count = Cv2.ConnectedComponentsWithStats(filter2D, label, stats, centroids, PixelConnectivity.Connectivity8, MatType.CV_32SC1);  

var indexes = stats.Col((int)ConnectedComponentsTypes.Area).SortIdx(SortFlags.EveryColumn);  

var indexer = stats.GetGenericIndexer<int>();  

var output = filter2D.CvtColor(ColorConversionCodes.GRAY2BGR);  

for (int i = 0; i < indexes.Rows - 1; i++)  
{  
    var index = indexes.Get<int>(i);  

    var area = indexer[index, (int)ConnectedComponentsTypes.Area];  

    var rect = new Rect  
    {  
        X = indexer[index, (int)ConnectedComponentsTypes.Left],  
        Y = indexer[index, (int)ConnectedComponentsTypes.Top],  
        Width = indexer[index, (int)ConnectedComponentsTypes.Width],  
        Height = indexer[index, (int)ConnectedComponentsTypes.Height]  
    };  

    if (area < 8)  
    {  
        output.Rectangle(rect, Scalar.Black, -1);  
    }  
    else  
    {  
        output.Rectangle(rect, Scalar.Red);  
    }  
}  

Cv2.ImShow("output", output);  

/* // ConnectedComponentsWithStatsを使用せず、MorphologyExで白点を除去する場合  
byte[,] element3 = { { 0, 1 },  
                     { 1, 0 },  
};  

Cv2.MorphologyEx(filter2D, filter2D, MorphTypes.Open, InputArray.Create(element3));  

byte[,] element4 = { { 1, 0 },  
                     { 0, 1 },  
};  

Cv2.MorphologyEx(filter2D, filter2D, MorphTypes.Open, InputArray.Create(element4));  

byte[,] element5 = { { 1, 1 },  
};  

Cv2.MorphologyEx(filter2D, filter2D, MorphTypes.Close, InputArray.Create(element5));  

Cv2.ImShow("filter2D", filter2D);  
*/  

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@u4xiの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう