OpenCVで二値化 +あるふぁ
最近忙しくて長らく更新できませんでした。
うちの学校では毎年10月に高専祭で一般向けにサンドブラスト体験ができるんですね。
それに使う画像は白黒画像でないとやりづらいので、カラー画像を二値化するプログラムを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;
}
元画像はこれと、
これ!
実行!
うんいい感じ!(ほれぼれ)
閾値決めるのに結構時間かかったけど...
プログラムの説明を軽くすると、
- threshold関数で入力画像を二値化、その際閾値を決める
- ~(チルダ)で画像反転
- dilate関数で膨張処理
- imwrite関数で保存
うわぁ雑...でもホントこれだけで画像処理できるってスゴイねopencv!
では