質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

589閲覧

二値化と平滑化をするプログラム

yu_ma1209

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2023/05/22 04:58

実現したいこと

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;

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2023/05/22 04:59

しつもんはなんですか
fana

2023/05/22 09:36

> 二値化と平滑化をする とは,どういう出力を期待? {入力画像を二値化したもの,入力画像を平滑化したもの}という2つ? それとも「入力画像を二値化して,それをさらに平滑化したもの」という1つ?
yu_ma1209

2023/05/22 12:06

二値化して平滑化するプログラムです。
fana

2023/05/23 03:08

「AしてBしてCする」を作るときには, 【まず「Aだけやる」を実現し,次にBの部分を加えて「AしてBする」を達成し,最後にCの部分を加えて完成させる】 という手順で取り込むのが素直でわかりやすいと思います. 本件で言えば,先に二値化するという話であれば, 「まずは二値化だけを行うものを完成させて →その後,さらに平滑化する部分を加える」という手順. (いきなり GaussianBlur とか持ち込むのではなくて) 二値化については「OpenCV 二値化」とかでググるなりすればそれ用の関数が存在するのがわかると思いますので,まずはそれを使ってみてはどうですか.
episteme

2023/05/23 03:21

...僕の回答ではダメなんですかね?
guest

回答1

0

たとえばこんなカンジですかね...(画像はWebカメラから拾ってます)

C++

1#include "opencv2/opencv.hpp" 2#include <cstdint> 3 4int main() { 5 cv::VideoCapture cap(0); 6 if ( !cap.isOpened() ) return -1; 7 8 for(;;) { 9 cv::Mat src_img; 10 cv::Mat dst_img; 11 cap >> src_img; // Web-cameraから読み込んで 12 13 // Gray-scale に変換し 14 cv::cvtColor(src_img, dst_img, cv::COLOR_BGR2GRAY); 15 // 二値化して 16 std::for_each(dst_img.begin<uint8_t>(), dst_img.end<uint8_t>(), 17 [](auto& pixcel) { pixcel = (pixcel > 127) ? 255 : 0;}); 18 // ガウシアン・ブラーで平滑化して 19 cv::GaussianBlur(dst_img, dst_img, cv::Size(101,101), 0); 20 21 // 画面に表示 22 cv::imshow("dst", dst_img); 23 if( cv::waitKey(30) >= 0) break; 24 } 25 return 0; 26}

投稿2023/05/22 05:29

編集2023/05/22 07:25
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問