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

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

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

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

C++

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

Q&A

解決済

1回答

3956閲覧

c++ 指定した階調にポスタリゼーションするプログラム

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

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

C++

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

1グッド

0クリップ

投稿2020/05/23 13:40

編集2020/05/23 16:44

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
C++で任意の階調にポスタリゼーションするプログラムを作っています。下記のプログラムを実行すると一応ポスタリゼーションはできているようなのですがそのポスタリゼーション後の画像がなぜか三分の一しか表示されず残りは真っ黒です。何故なのか教えていただけましたら幸いです。

発生している問題・エラーメッセージ

出力画像が3分の1しかポスタリゼーションされず残りは真っ黒になってしまいます。イメージ説明

該当のソースコード

ソースコード
include <stdio.h>
include <iostream>
include <opencv2/opencv.hpp>
define FILE_NAME "../Debug/test.jpg"
define WINDOW_NAME_INPUT "input"
define WINDOW_NAME_OUTPUT "output"
define COLOR_NUM (256) //色値

int main(int argc, const char * argv[]) {
//scanfで指定階調を取得
int num;
printf("指定したい階調を入力してください。\n");
scanf("%d",&num);

//画像の入力 int x, y; cv::Mat src_img = cv::imread(FILE_NAME); if (src_img.empty()) { //入力失敗の場合 return (-1); } //出力画像メモリ確保 cv::Mat dst_img = cv::Mat(src_img.size(), CV_8UC3); //ルックアップテーブル uchar lut[COLOR_NUM]; for (int i=0; i<COLOR_NUM; i++) { //ポスタリゼーション lut[i] = (i / (COLOR_NUM / num)) * (COLOR_NUM / num); } //画像の走査 //縦 for (y=0; y<dst_img.rows; y++) { //横 for (x=0; x<dst_img.cols; x++) { uchar s = src_img.at<uchar>(y,x); dst_img.at<uchar>(y, x) = lut[s]; } } //画像の表示 cv::imshow(WINDOW_NAME_INPUT, src_img); cv::imshow(WINDOW_NAME_OUTPUT, dst_img); cv::imwrite("test.png", dst_img); cv::waitKey(); //キー入力待ち (止める) return 0;

}

試したこと

ここにより詳細な情報を記載してください

-dadjdjm👍を押しています

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

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

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

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

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

SHOMI

2020/05/23 15:47

タグのXcodeもCMakeも質問内容に関係ないので外して、OpenCVをつけたほうがよいかと。
guest

回答1

0

ベストアンサー

cv:Mat::at<uchar>(x,y)CV_8UC1用です。実際はCV_8UC3なので左1/3しかアクセスできていません。

diff

1- uchar s = src_img.at<uchar>(y, x); 2+ cv::Vec3b s = src_img.at<cv::Vec3b>(y, x); 3- dst_img.at<uchar>(y, x) = lut[s]; 4+ dst_img.at<cv::Vec3b>(y, x) = cv::Vec3b(lut[s[0]], lut[s[1]], lut[s[2]]);

投稿2020/05/23 14:25

編集2020/05/23 14:32
SHOMI

総合スコア4079

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問