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

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

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

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1755閲覧

jiMat 画像の加算、積算によるオーバーフロー時の正規化処理について

ttyy1101

総合スコア18

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/04/25 04:47

編集2019/04/25 06:35

サンプルコードは以下です。

C++

1Mat img1=imread("./img1.jpg"); 2Mat img2=imread("./img2.jpg"); 3Mat out; 4Mat out2; 5 6out = img1 + img2; 7out2 = img1 + 1.5 * img2; 8 9imwrite("./out.jpg", out); 10imwrite("./out2.jpg", out2);

このようなコードでMat画像を加算もしくは積算したときに、
画素値の計算結果が255より大きくなった場合には
正規化処理が行われているはずですが、
各チャンネル r,g,bでどのような正規化処理が行われているか不明です。

どなたかお分かりの方、ご教授願います。

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

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

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

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

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

guest

回答1

0

ベストアンサー

r,g,b毎に,

  • 0を下回った場合は0に
  • 255を上回った場合は255に

値が切られる結果になるハズです.

#演算結果の画素値を調べてみればよいのでは…

投稿2019/04/25 05:48

fana

総合スコア11656

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

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

ttyy1101

2019/04/25 07:13

失礼しました。 画素にアクセスして画素値をprintfで確認したところ、 無秩序な値が表示されていたのでどんな処理が行われているか気になったのですが コードにミスがありました。 再度試したところ、おっしゃる通り255でストップさせるような処理がされていました。 ありがとうございます。 しかし下記のコードを見ていただけますでしょうか //////////////////////////////////////////////////////////////////////////////// out2.at<cv::Vec3b>(200, 200)[0]=500; out2.at<cv::Vec3b>(200, 200)[1]=100; out2.at<cv::Vec3b>(200, 200)[2]=700; printf("out20,%d\n", out2.at<cv::Vec3b>(200, 200)[0]); printf("out21,%d\n", out2.at<cv::Vec3b>(200, 200)[1]); printf("out22,%d\n", out2.at<cv::Vec3b>(200, 200)[2]); ///////////////////////////////////////////////////////////////////////// //////////////出力////////////// out20,244 out21,100 out22,188 ///////////////////////////////// このように画素値の代入を行った結果 rgbのバランスが崩れる結果となってしまいました。 (特にチャンネル[2]で代入した値700が出力で188になった理由が分かりません。) この点についてもしお分かりでしたら教えていただきたいです。
fana

2019/04/25 07:18

それはcv::Matに対する操作ではなく,1byteサイズの領域に 500 や 700 といった値を代入しようとしたからでしょう. unsigned char A = 700; としたらAの値が188になりますよね.
ttyy1101

2019/04/25 09:14

なるほど解決いたしました。 これからはデータ型に気を付けようと思います。 ありがとうございますm(._.)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問