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

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

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

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

C++

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

Python

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

Q&A

解決済

2回答

2398閲覧

「IT Text 画像工学」 OpenCVの処理について

teefpc

総合スコア111

OpenCV

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

C++

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

Python

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

0グッド

0クリップ

投稿2019/01/17 09:23

編集2019/01/17 09:29

「IT Text 画像工学」という本の画像のポスタリゼーションのコードなのですが、
本によると、4階調のポスタリゼーションカラーに変換されるようです。

しかしソースを読む限り、入力画像と出力画像の結果は同じです。
Pythonに移植して実行してみましたが、結果は変わりません。

なぜでしょうか

https://www.ohmsha.co.jp/book/9784274220074/

cpp

1// 2// sample-2_6.cpp 3// look up table 4// 5// Created by sawano on 2016/09/12. 6// Copyright © 2016年 AIT. All rights reserved. 7// 8#include <iostream> 9#include <opencv2/opencv.hpp> 10 11 12#define VAL_MAX (256) //輝度値の要素数 13#define STEP (4) //ポスタリゼーションの段階数 14//入力画像 15#define FILENAME "input.jpg" 16//ウィンドウ名 17#define WINDOW_INPUT "input" 18#define WINDOW_OUTPUT "output" 19 20int main(int argc, const char * argv[]) { 21 int lut[VAL_MAX]; //ルックアップテーブルの宣言 22 23 //画像の入力 (グレースケール) 24 cv::Mat src_img = cv::imread(FILENAME, 0); 25 if (src_img.empty()) { //入力失敗の場合 26 return (-1); 27 } 28 29 //ルックアップテーブルの生成 30 for (int i=0; i<VAL_MAX; i++) { 31 //ポスタリゼーション 32 lut[i] = (i / (VAL_MAX / STEP)) * (VAL_MAX / STEP); 33 //ネガポジ変換 34 //lut[i] = (VAL_MAX-1) - i; 35 printf("%d: %d\n", i, lut[i]); 36 } 37 38 //出力画像のメモリ確保 39 cv::Mat dst_img = cv::Mat(src_img.size(), CV_8U, 1); 40 41 //画像の走査 (ヒストグラムの生成) 42 for (int y=0; y<src_img.rows; y++) { //縦 43 for (int x=0; x<src_img.cols; x++) { //横 44 dst_img.at<unsigned char>(y, x) = lut[src_img.at<unsigned char>(y, x)]; 45 } 46 } 47 //画像の表示 48 cv::imshow(WINDOW_INPUT, src_img); 49 cv::imshow(WINDOW_OUTPUT, dst_img); 50 cv::waitKey(); //キー入力待ち 51 cv::imwrite("posterization.jpg", dst_img); //画像の保存 52 53 return 0; 54} 55

Python

1# -*- coding: utf-8 -*- 2"""Tone-curve-Postarization.ipynb 3 4Automatically generated by Colaboratory. 5 6Original file is located at 7 https://colab.research.google.com/drive/1jU2JgQ2kJhRBwaTt3S6VyRILmUFueHIc 8""" 9 10!wget http://www.centerportgardenclub.org/wp-content/gallery/photos/2014-marisa-comple-IMG_5867.jpeg img.jpg 11 12mv 2014-marisa-comple-IMG_5867.jpeg img.jpg 13 14ls 15 16# %matplotlib inline 17import cv2 18import matplotlib.pyplot as plt 19 20src_img = cv2.imread("img.jpg", 0); 21plt.imshow( src_img) 22 23max_ = 256 24step_ = 4 25 26lut = [0] * max_ 27for i in range(max_): 28 lut[i] = (i / (max_ / step_)) * (max_ / step_) 29 30dst_img = [] 31for i in range(480): 32 temp = [] 33 for j in range(480): 34 temp.append(0) 35 36 dst_img.append(temp) 37dst_img[1][5] 38 39for y in range(src_img.shape[0]): 40 for x in range(src_img.shape[1]): 41 dst_img[y][x] = lut[src_img[y][x]]; 42 43dst_img[170][239] 44 45src_img.shape 46 47plt.imshow(dst_img) 48 49

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

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

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

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

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

tiitoi

2019/01/17 09:25

Python に移植したコードも貼れますか?
tiitoi

2019/01/17 09:29

Lookup Table 作成のところを見ると、 lut[i] = (i / (VAL_MAX / STEP)) * (VAL_MAX / STEP); となっていますが、結局これは lut[i] = i なので、元の画像から画素値が変更されません。 書籍からのコピペミス等はないでしょうか?
teefpc

2019/01/17 09:51 編集

ありがとうございます。Python コードも追加しました。 サイトからのダウンロードソースと、本とを見比べましたが、同じでした
tiitoi

2019/01/17 09:53 編集

LouiS さんの回答のように、C の 整数 / 整数 は Python 3 でいう 整数 // 整数 だから、lut[i] = i とは、Cのコードだとならないですね。勘違いしてました。すいません。 なので、C から Python に移植する際は注意が必要ですね。
teefpc

2019/01/17 09:57

Python 2.xでは、/ 記号でも、C++と同じように整数で、返していたようですね。 色々とありがとうございました。
guest

回答2

0

ベストアンサー

次のように書いたら上手くいきませんか?

Python

1lut[i] = (i // (max_ // step_)) * (max_ // step_)

整数わる整数の計算結果が、C++とPythonでは異なりますので。

修正: max_ / step_ を max_ // step_ に変更
step_ は max_ の約数ではありますが、念のため。

投稿2019/01/17 09:37

編集2019/01/17 09:48
LouiS0616

総合スコア35660

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

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

teefpc

2019/01/17 09:51

ありがとうございます!できました。 これは、自動でint 型にキャストしているのですね。
LouiS0616

2019/01/17 09:59

整数除算ですね。 実装を知らないので想像の範疇を出ませんが、計算後に整数に変換しているのではなく、最初から専用の命令を利用しているように思えます。
guest

0

4階調のポスタリゼーション 実行結果 左:入力 右:出力

イメージ説明イメージ説明

投稿2019/01/17 10:07

編集2019/01/17 10:09
teefpc

総合スコア111

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問