craneの技術録

writeupとかいろいろ

OpenCVで二値化 +あるふぁ

最近忙しくて長らく更新できませんでした。

 

うちの学校では毎年10月に高専祭で一般向けにサンドブラスト体験ができるんですね。

サンドブラスト - Wikipedia

それに使う画像は白黒画像でないとやりづらいので、カラー画像を二値化するプログラムをopencvで作っちゃいました!(フォトショ使えよって話)

 #include "opencv/cv.hpp"

#include "opencv/highgui.h"

using namespace cv;
int main(){
Mat img = imread("input.jpg", IMREAD_UNCHANGED);
Mat gray_img;
Mat element = Mat::ones(3, 3, CV_8UC1); //3×3の行列で要素はすべて1 dilate処理に必要な行列
cvtColor(img, gray_img, CV_BGR2GRAY);
Mat bin_img;
threshold(gray_img, bin_img, 120, 255, THRESH_BINARY); //閾値設定
//bin_img = ~bin_img; //反転
dilate(bin_img, bin_img, element, Point(-1, -1), 0); //最後の引数で膨張処理回数を設定
imshow("IMAGE", bin_img); //変更
//imwrite("out.jpg", bin_img); //画像保存
waitKey(0);
return 0;
}

 

元画像はこれと、

f:id:roots320:20160908205711j:plain

 

これ!

f:id:roots320:20160908205731j:plain

 

 

実行!

 

 

f:id:roots320:20160908205801j:plain

 

f:id:roots320:20160908205810j:plain

 

 

うんいい感じ!(ほれぼれ)

閾値決めるのに結構時間かかったけど...

 

プログラムの説明を軽くすると、

  • threshold関数で入力画像を二値化、その際閾値を決める
  • ~(チルダ)で画像反転
  • dilate関数で膨張処理
  • imwrite関数で保存

うわぁ雑...でもホントこれだけで画像処理できるってスゴイねopencv

 

では