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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

Python

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

Q&A

1回答

638閲覧

OpenCVによる出力画像について

rep0

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

Python

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

0グッド

0クリップ

投稿2020/06/19 10:49

要素がすべて0で128x128の行列Xを作成
X=np.zeros([128,128],np.float32)
要素がすべて1の1行2列v、wを作成
w=[i][j]とした場合、forでiとjそれぞれ-64から63まで1づつ変化
wとvの内積をX[i,j]に代入
Xの要素の最大値255,最小値0となるようにXを正規化
コメントに沿ったコードのXの出力画像はどのようなものになるのでしょうか

徐々に色がうっすらと変わってくる画像であると考えています。

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

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

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

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

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

tiitoi

2020/06/19 11:10

まずはコードを書いてみてください
rep0

2020/06/19 11:14

import numpy as np import cv2 X=np.zeros([128,128],np.float32) #要素がすべて1の2行行列v、wを作成# v=np.ones([2,1],np.float32) w=np.ones([2,1],np.float32) #w=[i][j]とした場合、forでiとjそれぞれ-64から63まで1づつ変化# i=w[:,0] j=w[0,:] for i in range(-64,63): for j in range(-64,63): #wとvの内積をX[i,j]に代入# np.dot(w,v,out = X[i][j]) #Xの要素の最大値255,最小値0となるようにXを正規化# np.clip(X,0,255) #Xを表示# cv2.imshow(X) cv2.waitKey(0)
rep0

2020/06/19 11:15

line 19, in <module> np.dot(w,v,out = X[i][j]) File "<__array_function__ internals>", line 6, in dot TypeError: 'out' must be an array というエラーメッセージが出てきます どこか違うのでしょうか。大雑把な質問で申し訳ございません
guest

回答1

0

どのような処理をしたいのか見えてこないため、とりあえずおかしい点について述べます。

    1. 形状 (2, 1) の行列 v と形状 (2, 1) の行列 w にたいして、numpy.dot() を呼ぶと行列積になるので、(2, 1) の行列と (2, 1) の行列の行列積は計算できません。ベクトルであれば、1次元配列で定義してください。

python

1v = np.ones(2, np.float32) 2w = np.ones(2, np.float32) 3 4ret = np.dot(w, v) 5print(ret)
    1. i, j について

python

1i = w[:, 0] 2j = w[0, :]

この変数 i, j は下記で再代入されるので、意味がありません。

python

1for i in range(-64, 63): 2 for j in range(-64, 63):

np.dot(w, v) の結果を X[i, j] に代入したいのであれば、以下のようにするべきです。

X[i, j] = np.dot(w, v)
    1. 正規化について
np.clip(X, 0, 255)

これは値を [0, 255] の範囲外のものがあれば、[0, 255] にするという関数であって、正規化を行う関数ではありません。正規化を行う関数は numpy にないので、自分で実装する必要があります。

python

1def array_to_img(arr): 2 # [0, 1] にする 3 arr = arr - arr.min() 4 if arr.max() != arr.min(): 5 arr /= (arr.max() - arr.min()) 6 # [0, 255] にする 7 arr = (arr * 255).astype("uint8") 8 9 return arr 10 11arr = np.random.randn(5, 5) 12img = array_to_img(arr) 13print(img)
    1. 画像のインデックス

画像の大きさが (128, 128) ならば、有効なインデックスの範囲は i, j = 0, 1, ..., 127 です。
なので、range(-64, 63) なら IndexError になります。

python

1for i in range(-64, 63): 2 for j in range(-64, 63): 3 X[i][j] # エラー
    1. 出力される画像

徐々に色がうっすらと変わってくる画像であると考えています。

ベクトル [1, 1] とベクトル [1, 1] の内積は2なので、すべての要素が2なら真っ黒の画像になるのではないでしょうか?

追記

python

1import cv2 2import matplotlib.pyplot as plt 3import numpy as np 4 5# 全て0の128行列128列Xを作成# 6X = np.zeros([128, 128], np.float32) 7# 全て1の1行2列vを作成# 8v = np.ones(2, np.float32) 9# 全て1の1行2列vを作成# 10w = np.ones(2, np.float32) 11# w=[i][j]とした場合、forでiとjそれぞれ-64から63まで1づつ変化させwとvの内積をX[i,j]に代入# 12for i in range(128): 13 for j in range(128): 14 X[i, j] = np.dot(v, w) 15 16def array_to_img(arr): 17 # [0, 1] にする 18 arr = arr - arr.min() 19 if arr.max() != arr.min(): 20 arr /= arr.max() - arr.min() 21 # [0, 255] にする 22 arr = (arr * 255).astype("uint8") 23 24 return arr 25 26 27img = array_to_img(X) 28 29plt.imshow(img, cmap="gray") 30plt.show()

投稿2020/06/19 11:35

編集2020/06/19 12:34
tiitoi

総合スコア21956

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

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

rep0

2020/06/19 12:17

丁寧な回答ありがとうございます。 このようにコードを作成いたしました。 import numpy as np import cv2 #全て0の128行列128列Xを作成# X=np.zeros([128,128],np.float32) #全て1の1行2列vを作成# v = np.ones(2, np.float32) #全て1の1行2列vを作成# w = np.ones(2, np.float32) #w=[i][j]とした場合、forでiとjそれぞれ-64から63まで1づつ変化させwとvの内積をX[i,j]に代入# for i in range(-64, 63): for j in range(-64, 63): X[i][j] #Xの最大値を255最小値を0正規化# X[i,j] = np.dot(w,v) def array_to_img(arr): # [0, 1] にする arr = arr - arr.min() if arr.max() != arr.min(): arr /= (arr.max() - arr.min()) # [0, 255] にする arr = (arr * 255).astype("uint8") return arr arr = np.random.randn(5, 5) img = array_to_img(arr) #Xを表示# print(img) 結果 [[ 94 107 70 132 191] [ 43 88 196 168 255] [ 28 53 230 168 82] [165 119 75 20 112] [220 152 193 0 188]]
rep0

2020/06/19 12:18

黒い画像が表示されませんでした
tiitoi

2020/06/19 12:33

> 黒い画像が表示されませんでした 表示するには、matplotlib なりで画像を表示するコードが必要です。 一応動くコードを追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問