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

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

新規登録して質問してみよう
ただいま回答率
85.46%
OpenCV

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

C++

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

Q&A

1回答

3604閲覧

openCV(C++)で10bitの画像を表示する

snakaz

総合スコア1

OpenCV

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

C++

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

0グッド

0クリップ

投稿2021/12/17 08:47

現在、openCVを用いて画像処理のプログラムを作っているものです。

現在8bitの画像をグレースケールで複数枚用意して、用意した画像それぞれの各画素値の総和を10bitのグレースケール画像で表示しようとしています。

(例えば画像を二枚用意してそれぞれの(0,0)の位置の画素値を

  image1.at<unsigned char>(0, 0)=1;
image2.at<unsigned char>(0, 0)=2;

  とすると、

output.at<unsigned char>(0, 0)=3;

  として、このoutputを10bitで表示したい。)

convertToを用いてbit変更をし、imshowを用いて画像を表示しているのですが引数にbit数指定がなく困って言います。
ほかに画像を表示する関数があれば教えていただきたいです。

コードは、以下のような感じで設定してあります。

c++

1std::vector<Mat>images(EXPECTED_IMAGES); 2 3 ostringstream os; 4 os << setfill('0') << setw(3) << t++; 5 6 for (int z = 0; z < EXPECTED_IMAGES; z++) { 7 Mat cv_mat_image = cam.GetNextImageOcvMat(); //画像のキャプチャ 8 images[z] = cv_mat_image.clone(); //深いコピー 9 } 10 11 Mat output = images[0].clone(); //格納する枠組み// 12 Mat totaloutput ; 13 14 output.convertTo(totaloutput, CV_16U); 15 16 int HIGH = images[0].rows; //画像の高さ 17 int WIDTH = images[0].cols; //画像の幅 18 19 cout << "HIGH:" << HIGH << endl; 20 cout << "WIDTH:" << WIDTH << endl; 21 22 23 /*画素値総和*/ 24 for (int y = 0; y < HIGH; y++) { 25 for (int x = 0; x < WIDTH; x++) { 26 27 int pixel[EXPECTED_IMAGES] = { 0 }; 28 29 for (int z = 0; z < EXPECTED_IMAGES; z++) { 30 pixel[z] = images[z].at<unsigned char>(y, x); 31 } 32 33 totaloutput.at<unsigned char>(y, x) = std::accumulate(pixel, pixel + EXPECTED_IMAGES, 0); 34 35 } 36 } 37 38 39 /*画素値総和用*/ 40 cv::imshow("image" + os.str(), totaloutput); 41 imwrite("totalimage" + os.str() + ".png", totaloutput);

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

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

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

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

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

guest

回答1

0

totaloutput.at<unsigned char>(y, x) = ...

16bitなのに unsigned char でアクセスするのは間違ってますよね.

画素値総和を求む箇所が何だか冗長に見えます.
(途中で配列に各画像の画素値を入れるようなことに特段の必要性が無いのであれば)このくらいで良いのでは:

C++

1totaloutput = 0; //全0 2 3for(int z = 0; z < EXPECTED_IMAGES; z++) 4{ cv::add( images[z], totaloutput, totaloutput, cv::noArray(), totaloutput.depth() ); }

imshow がbit深度毎にどういう表示を行うのかはリファレンスを見れば書いてあります.

If the image is 8-bit unsigned, it is displayed as is. If the image is 16-bit unsigned or 32-bit integer, the pixels are divided by 256. That is, the value range [0,255*256] is mapped to [0,255]. If the image is 32-bit or 64-bit floating-point, the pixel values are multiplied by 255. That is, the value range [0,1] is mapped to [0,255].

画像を表示する

と言いますが,10bit幅の値がどのように表示されることを想定されているのでしょう?
(目的が「10bit深度データの可視化」であれば,てきとーに見やすい感じの表示用の画像を用意すればよいだけですが.)

投稿2021/12/17 09:05

編集2021/12/17 09:37
fana

総合スコア11708

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

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

fana

2021/12/17 09:44

単に 10bit の範囲を 8bit に潰して表示すれば済むならそれでいい. 何かしら 10bit の諧調(1024諧調) が表示上でも存在しないとならないという話なら,適当に色のグラデーションとかで表す必要があるかと. (目視で1024種類の色の差が判別付くかどうかは別として)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問