3

ハイ!numpy 配列 imgA - imgB として 2 つの画像 (同じ次元) があります。各行と列を反復処理して、そのようなものを取得したいと思います。

for i in range(0, h-1):
  for j in range(0, w-1):
    final[i][j]= imgA[i,j] - imgB[i-k[i],j]

ここで、h と w は画像の高さと幅、k は次元 [h*w] の配列です。

私はこのトピックを見てき ました: numpy 配列を反復処理し ていますが、画像では機能しません。エラーが発生します: unpack する値が多すぎます numpy と python 2.7 でそれを行う方法はありますか?

ありがとう

編集私は自分自身をよりよく説明しようとします。LAB色空間に2つの画像があります。これらの画像は (288,384,3) です。ここで、deltaE を作成したいので、そのようにすることができます (2 つの配列を吐き出します):

 imgLabL=np.dsplit(imgL,3)
 imgLabR=np.dsplit(imgR,3)
 imgLl=imgLabL[0]
 imgLa=imgLabL[1]
 imgLb=imgLabL[2]
 imgRl=imgLabR[0]
 imgRa=imgLabR[1]
 imgRb=imgLabR[2]
delta=np.sqrt(((imgLl-imgRl)**2) + ((imgLa - imgRa)**2) + ((imgLb - imgRb)**2)   )

今まではすべて順調です。しかし今、私はこの配列 k のサイズ (288,384) を持っています。だから今、新しいデルタが必要ですが、imgRl(0,0) のピクセルのように x 軸が異なります。imgLl(0+k,0) にピクセルを追加したいです。

私の問題はもっとありますか?

4

2 に答える 2

2

あなたがやろうとしていることは何でもベクトル化して、ループなしで実行できると確信しています。しかし、あなたのコードが書かれている方法では、それが機能しないのは当然です...

kが形状の配列である場合(h, w)、は形状k[i]の配列です(w,)。あなたがそうするときi-k[i]、numpyはその放送魔法をします、そしてあなたは形の配列を得るでしょう(w,)。したがってimgB、形状の配列と(w,)単一の整数を使用してインデックスを作成しています。インデックス付けの項目の1つが配列であるため、派手なインデックス付けが始まります。したがって、imgBも形状があると仮定(h, w, 1)すると、の戻り値はimgB[i-k[i], j]形状の配列ではなく、形状の配列になり(1,)ます(w, 1)imgA[i, j]次に、形状の配列であるからそれを差し引こうとすると(1,)、ブロードキャストマジックが再び機能するため、形状の配列が得られます(w, 1)

何なのかわかりませんfinal。しかし、それが形状の配列である場合(h, w, 1)、asimgAimgBfinal[i][j]は形状の配列であり、それに適合しない(1,)形状の配列を割り当てようとしています。(w, 1)したがって、operand requires a reduction,but reduction is not enabledエラーメッセージ。

編集

DeltaEを計算するために配列を分割する必要はありません...

def deltaE(a, b) :
    return np.sqrt(((a - b)**2).sum(axis=-1))

delta = deltaE(imgLabL, imgLabR)

2番目のケースで何をしたいのかまだわかりません...x軸に沿って変位した2つの画像を比較したい場合は、次を使用することをお勧めしnp.rollます。

deltaE(imgLabL, np.roll(imgLabR, k, axis=0))

のピクセルとのピクセルの間の位置(r, c)にdeltaEがあります。それはあなたが望むものですか?(r, c)imgLabL(r - k, c)imgLAbR

于 2012-12-13T17:44:36.217 に答える
1

私は通常、を使用しますnumpy.nditer。ドキュメントはここにあり、多くの例があります。簡単に:

import numpy as np
a = np.ones([4,4])

it = np.nditer(a)
for elem in a:
    #do stuff

cスタイルの反復を使用することもできます。

while not it.finished:
    #do stuff
    it.iternext()

配列のインデックスにアクセスする必要がある場合。あなたの状況では、2つの画像を一緒に圧縮して形状の配列を作成し、[2,h,w]これを繰り返して、空の配列に計算結果を入力します。

于 2012-12-13T19:07:19.003 に答える