実現したいこと
openCVでグレースケール画像を読み込んで二値化と平滑化をする。
閾値は127とする
該当のソースコード
c++
#include <iostream>
// OpenCV用のヘッダファイル
#include <opencv2/opencv.hpp>
//画像ファイル (サイズは小さめが良い)
#define FILE_NAME "kanji.jpg"
#define WINDOW_NAME_INPUT "input"
#define WINDOW_NAME_OUTPUT "output"
#define COLOR_NUM (255)
int main(int argc, const char * argv[]) {
int n;
//画像の入力
cv::Mat src_img = cv::imread(FILE_NAME, cv::IMREAD_GRAYSCALE); //画像の読み込み
if (src_img.empty()) { //入力失敗の場合
fprintf(stderr, "読み込み失敗\n");
return (-1);
}
cv::Mat dst_img;
#define FILTER_SIZE (100) cv::GaussianBlur(src_img, dst_img, cv::Size(FILTER_SIZE, FILTER_SIZE), 0); uchar hist[COLOR_NUM]; for (int i=0; i<COLOR_NUM; i++) { if (i<=120) { hist[i]=0; }else hist[i] = 255; } cv::imshow(WINDOW_NAME_INPUT, src_img); cv::imshow(WINDOW_NAME_OUTPUT,dst_img); cv::waitKey(); //キー入力待ち (止める) return 0;
}
しつもんはなんですか
> 二値化と平滑化をする
とは,どういう出力を期待?
{入力画像を二値化したもの,入力画像を平滑化したもの}という2つ?
それとも「入力画像を二値化して,それをさらに平滑化したもの」という1つ?
二値化して平滑化するプログラムです。
「AしてBしてCする」を作るときには,
【まず「Aだけやる」を実現し,次にBの部分を加えて「AしてBする」を達成し,最後にCの部分を加えて完成させる】
という手順で取り込むのが素直でわかりやすいと思います.
本件で言えば,先に二値化するという話であれば,
「まずは二値化だけを行うものを完成させて →その後,さらに平滑化する部分を加える」という手順.
(いきなり GaussianBlur とか持ち込むのではなくて)
二値化については「OpenCV 二値化」とかでググるなりすればそれ用の関数が存在するのがわかると思いますので,まずはそれを使ってみてはどうですか.
...僕の回答ではダメなんですかね?
