OpenCvSharpで、画像を二値化する方法はグレースケールしてから、Cv.Thresholdで二値化します。
//using OpenCvSharp;
private IplImage getBinImage()
{
//元の画像を読込
IplImage img = new IplImage("test.jpg");
//二値化画像を保存するIplImageの準備
IplImage bin_iplImg = new IplImage(img.Width, img.Height, BitDepth.U8, 1);
//閾値
int threshould = 180;
//グレースケールに変換
img.CvtColor(bin_iplImg, ColorConversion.BgrToGray);
//二値化処理
Cv.Threshold(bin_iplImg, bin_iplImg, threshould, 255, ThresholdType.Binary);
return bin_iplImg;
}
でも、RGB各要素で閾値を変えたい場合、たとえば、緑成分の多い画像を処理したい時などには次のようにします。
//using OpenCvSharp;
IplImage getBinImage2()
{
//元の画像を読込
IplImage img = new IplImage("test.jpg");
//二値化画像を保存するIplImageの準備
IplImage bin_iplImg = Cv.CreateImage(img.Size, BitDepth.U8, 1);
//RGB要素のIplImageの準備
IplImage r_iplImg = Cv.CreateImage(img.Size, BitDepth.U8, 1);
IplImage g_iplImg = Cv.CreateImage(img.Size, BitDepth.U8, 1);
IplImage b_iplImg = Cv.CreateImage(img.Size, BitDepth.U8, 1);
//元画像をRGBに分解
Cv.Split(img, b_iplImg, g_iplImg, r_iplImg, null);
//RGB各要素の閾値
int r_threshold = 180;
int g_threshold = 230;
int b_threshold = 150;
// 各RGB要素で閾値以下のピクセルを抽出する
Cv.Threshold(r_iplImg, r_iplImg, r_threshold, 255, ThresholdType.BinaryInv);
Cv.Threshold(g_iplImg, g_iplImg, g_threshold, 255, ThresholdType.BinaryInv);
Cv.Threshold(b_iplImg, b_iplImg, b_threshold, 255, ThresholdType.BinaryInv);
// ORでRGB要素を合算
Cv.Or(b_iplImg, g_iplImg, bin_iplImg, null);
Cv.Or(bin_iplImg, r_iplImg, bin_iplImg, null);
return bin_iplImg;
}